Scrapy 实例——爬取豆瓣图书排名top250

1、安装

pip install E:\python\lxml-4.2.6-cp36-cp36m-win_amd64.whl

pip install E:\python\Twisted-18.9.0-cp36-cp36m-win_amd64.whl

pip install scrapy

2、爬虫实例

首先我们需要创建一个项目。

    scrapy startproject douban_book #

在命令行输入scrapy startproject + [项目名],这样会生成一个scrapy项目。我这个项目的名称是douban_book。大家一看这个名字就知道,我待会要去爬取豆瓣网站图书的内容。

我们来简单看一下该项目的目录结构

我们真正的爬虫程序是写在spiders/bookspider.py文件中的,bookspider.py是我自己创建的文件,其他的文件都是scrapy自己

自动初始化好的。

其中item.py是配置爬虫具体返回的数据,待会我们在具体的例子中会看到如何定义自己需要返回的东西;

pipeline.py是配置具体的通道信息;

settings.py是设置信息,爬虫大部分的配置信息都要在该文件中进行。

首先我们先编写item.py文件,该文件设置爬虫具体的返回数据。

    # -*- coding: utf-8 -*-
     
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    import scrapy
    class DoubanBookItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        name = scrapy.Field()
        price = scrapy.Field()
        publisher = scrapy.Field()
        ratings = scrapy.Field()
        edition_year = scrapy.Field()
        author = scrapy.Field()

这里我们需要返回具体某本书的名字,作者,价格,评分等信息,scrapy已经为我们定义好了一个item对象,我们只要使用

Scrapy.Field()这个域就可以定义我们想要返回的字典类型中的“k”值

接下来是最主要的bookspider.py文件了,

    import scrapy
    from douban_book.items import DoubanBookItem
    class BookSpider(scrapy.Spider):
        """docstring for BookSpider"""
        name = 'douban-book' #这个名字在后续执行爬虫时用
        allowed_domain = ['douban.com']
        start_urls = ['https://book.douban.com/top250']
        def parse(self, response):
            yield scrapy.Request(response.url, callback = self.parse_page)
            for page in response.xpath('//div[@class="paginator"]/a'):
                link = page.xpath('@href').extract()[0]
                yield scrapy.Request(link, callback = self.parse_page)
       def parse_page(self, response):
            for item in response.xpath('//tr[@class="item"]'):
                book = DoubanBookItem()
                book['name'] = item.xpath('td[2]/div[1]/a/@title').extract()[0]
                book['ratings'] = item.xpath('td[2]/div[2]/span[@class="rating_nums"]/text()').extract()[0]
                # book['ratings'] = item.xpath('td[2]/div[2]/span[2]/text()').extract()[0]
                book_info = item.xpath('td[2]/p[1]/text()').extract()[0]
                book_info_contents = book_info.strip().split(' / ')
                book['author'] = book_info_contents[0]
                book['publisher'] = book_info_contents[1]
                book['edition_year'] = book_info_contents[2]
                book['price'] = book_info_contents[3]
                yield book

这个文件的内容是具体的爬虫信息,先导入我们刚才定义的DoubanBookItem类,下面就要用这个类来具体实例化一个对象以存放返回的信息。我们依然需要定义一个爬虫类BookSpider,在这个类中定义了爬虫的名字“douban-book”,之后定义了一个容许访问的域,就是告诉爬虫可以去爬这个域中的内容。然后定义了爬虫开始的起始网页。

接下来就是定义解析函数parse了,parse函数做了两件事情,一个是发送当前网页(第一页)的请求,另一个是读出所有从第2页开始到最后一页的网络请求,然后向每一个网页发出请求。在parse函数中不具体解析数据,解析数据的工作给了每个请求中的回调函数进行。这个回调函数就是下面定义的parse_page函数。

parse_page函数是我们真正的爬虫数据函数,拿到response之后就对response的每个标签进行解析,然后放在实例化后的book对象中。这里有一个小小的问题,就是某一本书中作者,出版社,时间和价格是在一个string中,因此在拿到这个string后需要用split方法拆开,然后放入book的不同“k”中。最后就是返回book了。
 

程序完成后我们运行一下,返回到windows的命令行cmd,进入douban_book目录下

然后运行scrapy crawl douban-book -o bookInfo.csv。此处将爬取内容写入csv文件中,当然也可以写入到txt文件中,或是json和MySQL中。我第一次运行这个命令后,返回了403状态码,意思就是网站拒绝了我的请求。这是由于有些网站是不容许进行爬虫的,它发现你是爬虫后会拒绝掉你的请求。解决办法就是在settings.py文件中加入一句话

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

这句话的意思就是把我们的请求伪装成一个浏览器以骗过网站的检查,当然伪装有很多办法,这个只是其中的一种。

好了,加入上面那句代码后我们再运行scrapy crawl douban-book -o bookInfo.csv后就会得到我们想要的东西了。这里要说明一下,我是比较喜欢返回csv文件的,一来是因为这个返回结果可以直接在sublime中查看,中文也可以正常显示。

3、注意事项:

(1)需要有HTML的基础知识,理解标签、锚点等概念

(2)scrapy的选择器常用xpath和css,可以通过练习使用这两种选择器收集数据

(3)Scrapy就像是做填空题,涉及到4个文件,

items.py决定爬取哪些项目,

bookspider.py 决定怎么爬

settings.py决定由谁去处理爬取的内容

pipelines.py决定爬取后的内容怎么处理

(4)如果想要调试HTML文档选择器的执行结果,可以在cmd中切换到目录下用shell命令演示结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章