美文网首页
(二)爬虫框架(2)——第一个scrapy爬虫

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

作者: 爱折腾的胖子 | 来源:发表于2018-09-21 05:23 被阅读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案例结束。

    完整代码

    相关文章

      网友评论

          本文标题:(二)爬虫框架(2)——第一个scrapy爬虫

          本文链接:https://www.haomeiwen.com/subject/ryionftx.html