(二)爬虫框架(2)——第一个scrapy爬虫

2018-09-21  本文已影响0人  爱折腾的胖子

scrapy简介中简单介绍了scrapy爬虫,这节就深入的研究一下scrapy的各个模块的使用方法。

首先创建爬虫,在命令行中使用 scrapy startproject 项目名

创建项目
项目目录
可以看到目录中有一个scrapy.cfg文件,这个文件是scrapy项目的配置文件。
items.py:可以自定义item类,做为数据模型。
middlewares.py:可以自定义中间件。
pipelines.py:可以自定义Pipeline类,进行数据清洗,存储。
settings.py:爬虫的配置文件,例如可以设置爬虫的等待时间、并发数量等等。
还有两个__init__.py文件,打开看可以发现什么都没有,但是并不能删除。

创建好爬虫项目,也简略分析了每个文件的作用,可以发现一点,并没有哪个文件是给用户写爬虫逻辑的。
此时就需要下一条命令了, scrapy genspider 爬虫名 爬取的域名

创建爬虫
项目目录
可以看到spiders文件夹中多了一个movie_spider.py的文件,打开看一下:
import scrapy

class MovieSpiderSpider(scrapy.Spider):

    name = 'movie_spider' #爬虫名称
    allowed_domains = ['www.ygdy8.net'] #允许访问的域名
    start_urls = ['http://www.ygdy8.net/']  #爬虫爬取的url
    
    def parse(self, response):
        """
        处理返回的Response
        """
        pass

接下来,我们就把爬虫的逻辑完善一下,做一个爬取阳光电影的爬虫,记录一下电影名字和下载地址。
首先在items.py中创建一个item类:

# -*- coding: utf-8 -*-

import scrapy

class FirstScrapyItem(scrapy.Item):
    title = scrapy.Field()
    download_url = scrapy.Field()

然后完善一下爬虫的代码:

# -*- coding: utf-8 -*-

import scrapy
from urllib import parse
from .. import items

class MovieSpiderSpider(scrapy.Spider):
    name = 'movie_spider'
    allowed_domains = ['www.ygdy8.net']  # 允许访问的域名
    start_urls = [
        'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html',
        'http://www.ygdy8.net/html/gndy/dyzz/list_23_2.html',
        'http://www.ygdy8.net/html/gndy/dyzz/list_23_3.html',
        'http://www.ygdy8.net/html/gndy/dyzz/list_23_4.html',
        'http://www.ygdy8.net/html/gndy/dyzz/list_23_5.html'
    ]  # 电影天堂最新电影 前五页

    def parse(self, response):
        """
        处理返回的Response
        """
        #获取信息列表
        table_list = response.xpath("//*[@class=\"co_content8\"]/ul/td/table")
        for table in table_list:
            #获取详情页url,并且把url让如到Scheduler中,等待爬取
            url = table.xpath("./tr[2]/td[2]/b/a/@href").extract()[0]
            yield scrapy.Request(parse.urljoin(response.url, url), callback=self.parse_detail)

    def parse_detail(self, response):
        # print(response.body.decode("gbk"))
        content = response.xpath("//*[@class=\"bd3r\"]")
        item = items.FirstScrapyItem()
        item["title"] = content.xpath("./div[@class=\"co_area2\"]/div[@class=\"title_all\"]/h1/font/text()").extract()[0]
        item["download_url"] = content.xpath("./div[@class=\"co_area2\"]/div[@class=\"co_content8\"]/ul/tr[3]/td[1]/div[@align=\"left\"]/div[@id=\"Zoom\"]/td/table/tbody/tr/td/a/@href").extract()[0]
        yield item

然后再写一个管道,处理抓取的信息,暂时先写入到文本中,使用json格式:

# -*- coding: utf-8 -*-

import json

class FirstScrapyPipeline(object):
    def __init__(self):
        self.file = open("data.json", "w")

    def process_item(self, item, spider):
        text = json.dumps(dict(item), ensure_ascii=False) + "," + "\n"
        self.file.write(text)
        return item

    def close_spider(self, spider) :
        self.file.close()

最后配置一下settings.py文件

# -*- coding: utf-8 -*-

BOT_NAME = 'first_scrapy'

SPIDER_MODULES = ['first_scrapy.spiders']
NEWSPIDER_MODULE = 'first_scrapy.spiders'

#不遵守robot.txt协议
ROBOTSTXT_OBEY = False

#设置一下默认的header信息
DEFAULT_REQUEST_HEADERS = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}

#开启自定义的管道
ITEM_PIPELINES = {
   'first_scrapy.pipelines.FirstScrapyPipeline': 300,
}

最后在使用命令 scrapy crawl movie_spider 运行爬虫,如果没有异常,则会在项目根目录中出现一个data.json文件,里面存储的就是爬取的数据。


至此,第一个scrapy案例结束。

完整代码

上一篇下一篇

猜你喜欢

热点阅读