如何用Scrapy创建一个简单的爬虫
  • 创建虚拟环境并安装Scrapy

    创建leidian的虚拟环境,解释器是python3: mkvirtualenv leidian -p python3

    进入你的项目目录后,安装Scrapy:pip install scrapy

    安装成功后,pip list查看一下:如下图
    222222222.png

  • 流程分析

    抓取内容(百度贴吧:网络爬虫吧)

    页面: http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=utf-8

    数据:1.帖子标题;2.帖子作者;3.帖子回复数

    通过观察页面html代码来帮助我们获得所需的数据内容。

  • 工程建立

    在控制台模式下进入你要建立工程的文件夹执行如下命令创建工程:scrapy startproject leidian

    框架会自动在当前目录下创建一个leidian的文件夹,工程文件就在里边。

    进入leidian文件夹,用tree查看一下项目的原始文件结构,如下图:
    微信截图_20200328080111.png

  • 原始目录结构文件说明

    scrapy.cfg: 项目的配置文件

    leidian/: 该项目的python模块。之后您将在此加入代码。

    leidian/items.py:需要提取的数据结构定义文件。

    leidian/middlewares.py: 是和Scrapy的请求/响应处理相关联的框架。

    leidian/pipelines.py: 用来对items里面提取的数据做进一步处理,如保存等。

    leidian/settings.py: 项目的配置文件。

    leidian/spiders/: 放置spider代码的目录。原始里面只有一个__init__.py文件

  • 实现过程

    1、在spiders目录下新建爬虫scrapy genspider myspider 'baidu.com',然后在spider目录下会生成一个myspider.py文件,并添加如下代码:

  • import scrapy
    from leidian.items import LeidianItem
    import sys
     
     
    class MySpider(scrapy.Spider):
        """
        name:scrapy唯一定位实例的属性,必须唯一
        allowed_domains:允许爬取的域名列表,不设置表示允许爬取所有
        start_urls:起始爬取列表
        start_requests:它就是从start_urls中读取链接,然后使用make_requests_from_url生成Request,
                        这就意味我们可以在start_requests方法中根据我们自己的需求往start_urls中写入
                        我们自定义的规律的链接
        parse:回调函数,处理response并返回处理后的数据和需要跟进的url
        log:打印日志信息
        closed:关闭spider
        """
        # 设置name
        name = "spidertieba"
        # 设定域名
        allowed_domains = ["baidu.com"]
        # 填写爬取地址
        start_urls = [
            "http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=utf-8",
        ]
     
        # 编写爬取方法
        def parse(self, response):
            for line in response.xpath('//li[@class=" j_thread_list clearfix"]'):
                # 初始化item对象保存爬取的信息
                item = LeidianItem()
                # 这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
                item['title'= line.xpath(
                    './/div[contains(@class,"threadlist_title pull_left j_th_tit ")]/a/text()').extract()
                item['author'= line.xpath(
                    './/div[contains(@class,"threadlist_author pull_right")]//span[contains(@class,"frs-author-name-wrap")]/a/text()').extract()
                item['reply'= line.xpath(
                    './/div[contains(@class,"col2_left j_threadlist_li_left")]/span/text()').extract()
                yield item

    2、在items.py中定义自己要抓取的数据:

    # -*- coding: utf-8 -*-
     
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/items.html
     
    import scrapy
     
     
    class LeidianItem(scrapy.Item):
        # 抓取内容:1.帖子标题;2.帖子作者;3.帖子回复数
        title = scrapy.Field()
        author = scrapy.Field()
        reply = scrapy.Field()
        pass

    【注】上面类中的title、author、reply就像是字典中的“键”,爬到的数据就像似字典中的“值”。

    3、在存放items.json的目录下执行命令 scrapy crawl [类中name值]

    由于第二步中我们在类MySpider下定义了 name ="spidertieba"  ,所以执行命令:scrapy crawl spidertieba -o items.json。 -o  指定文件。 这样我们就会看到此目录下生成了items.json文件

    可以用cat items.json查看json的内容

    至此,一个scrapy的最简单的应用就完成了。