Scrapy 豆瓣爬虫

安装

下列的安装步骤假定您已经安装好下列程序:

您可以使用pip来安装Scrapy(推荐使用pip来安装Python package).

使用pip安装:

pip install Scrapy

创建项目

创建一个scrapy爬虫项目和一般的python框架一样,使用以下命令即可快速创建一个项目:

scrapy startproject 项目名称

该命令成功执行后,应包含如下目录:

doodlexu@MacBook tutorial % tree
.
├── scrapy.cfg
└── tutorial
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        └── __init__.py

2 directories, 7 files

这些文件分别是:

  • scrapy.cfg: 项目的配置文件
  • tutorial/: 该项目的python模块。之后您将在此加入代码。
  • tutorial/items.py: 项目中的item文件.
  • tutorial/pipelines.py: 项目中的pipelines文件.
  • tutorial/settings.py: 项目的设置文件.
  • tutorial/spiders/: 放置spider代码的目录.

定义Item

Item是爬取到的数据的容器,他的语法很简单,和python字典(dict)类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。

类似在ORM中做的一样,您可以通过创建一个 [scrapy.Item](https://scrapy-chs.readthedocs.io/zh_CN/0.24/

import scrapy

class douban_shortItem(scrapy.Item):
    votes   = scrapy.Field()  # 有用投票
    id      = scrapy.Field()  # 用户ID
    rating  = scrapy.Field()  # 用户打分
    date    = scrapy.Field()  # 短评日期
    content = scrapy.Field()  # 短评内容

编写爬虫

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。

其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 [item](https://scrapy-chs.readthedocs.io/zh_CN/0.24/

为了创建一个Spider,您必须继承 [scrapy.Spider](https://scrapy-chs.readthedocs.io/zh_CN/0.24/

以下为我们的Spider代码,它的目标是爬取电影(毒液2)的首页短评,并保存。代码需放在 tutorial/spiders 目录下的 douban_short.py 文件中:

import scrapy

from mySpider.items import douban_shortItem


class DoubanShortSpider(scrapy.Spider):
    name = 'douban_short'
    allowed_domains = ['douban.com']

    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
    }

    cookies = {
        'your_cookies' = 'your_values',
    }

    def start_requests(self):
        url = 'https://movie.douban.com/subject/30382416/comments'
        yield scrapy.Request(url, headers=self.headers, cookies=self.cookies)

    def parse(self, response):
        item = douban_shortItem()
        shorts = response.xpath('//div[@id="comments"]/div')
        for short in shorts:
            try:
                item['votes'] = short.xpath(
                    './/div[2]/h3/span[1]/span/text()').extract()[0]
                item['id'] = short.xpath(
                    './/div[2]/h3/span[2]/a/text()').extract()[0]
                item['rating'] = short.xpath(
                    './/div[2]/h3/span[2]/span[2]/@class').re(u'\d')[0]
                item['date'] = short.xpath(
                    './/div[2]/h3/span[2]/span[3]/text()').extract()[0].strip()
                item['content'] = short.xpath(
                    './/div[2]/p/span/text()').extract()[0]
                yield item
            except:
                pass

在爬取豆瓣的过程中,我们需要使用到cookies这项技术,它可以帮助服务器认识你是谁,给我们的小蜘蛛提供一层掩护,这样他就不会拒绝提供数据了。

另一个需要注意的点就是我们的headers,它的作用也和cookies类似,不过它不具备标识到个人,而是标识你用的是什么类型的浏览器和设备,以确保能正确解码。

这两项参数都可以在浏览器的开发者工具中找到,相信聪明的你一定可以的🤪

自动翻页

看到这,你肯定也发现了,到目前为止,这个小蜘蛛虽然干得很不错,顺利的拿到了数据,但还不够,我们需要所有数据。但是豆瓣为了保证用户体验,做了分页处理,这个时候要怎么办呢?

你已经是个成熟的🕷️了,你得学会自己翻页

回想一下,我们正常通过浏览器访问的时候,看下一页是通过点击次页按钮来实现的,那么我们的蜘蛛也可以这么做。我们可以通过xpath来定位到下一页按钮的目标的URL,并且只要它存在,我们就继续放🕷️:

next_url = response.xpath('//*[@id="paginator"]/a[@class="next"]/@href').extract()
        if next_url:
            next_url = 'https://movie.douban.com/subject/30382416/comments' + next_url[0]
            yield scrapy.Request(next_url, headers=self.headers, cookies=self.cookies)

至此,我们已经可以遍历所有的评论了。

爬取

进入项目的根目录,执行下列命令启动spider:

scrapy crawl douban_short

命令执行后会有一大堆调试日志输出,别紧张,这是正常的。你可以在setting.py里随意调整日志输出级别:

import logging

...
LOG_LEVEL = logging.DEBUG # 日志输出级别
...

保存

执行上面命令会爬,但不会存,我们需要利用一个-O的参数来指定保存的文件名以及格式,比如像这样:

scrapy crawl douban_short -O shorts.csv

他会将保存到item里面的数据保存到shorts.cvs文件里,而且scrapy会自动辨别你的文件格式,自动的解析并保存。它支持的格式有:

  • json
  • jsonlines
  • jl
  • csv
  • xml
  • marshal
  • pickle