背景知识

(一)什么是Scrapy呢?Python上精美的爬虫框架。什么是爬虫?可以扣押本身的心得感悟,也可自行谷歌百度。

(二)建议看下初识Scrapy的事先备安装Scrapy。

(三)Selectors根据XPath和CSS表达式从网页遭到摘数据。XPath和CSS表达式是什么事物,我们毫不太过度纠结,只待懂得好以它在网页遭到选择数据。用法:利用chrome去复制所急需数的职位信息。当然进阶的语可以扣押这里

右击

拷贝

骨干用法及认证:

  • response.selector.xpath(‘//title/text()’)##故而xpath选取了title的契内容
  • response.selector.css(‘title::text’)
    ##从而css选取了title的亲笔内容
    由selector.xpath和selector.css使用于宽泛,所以专门定义了xpath和css,所以地方吧足以描绘成:
  • response.xpath(‘//title/text()’)
  • response.css(‘title::text’)
    由<code>.xpath</code>和<code>.css</code>返回的都是<class
    ‘scrapy.selector.unified.SelectorList’>,因此好如此描写<code>response.css(‘img’).xpath(‘@src’).extract()</code>
  • 领取全部内容: .extract(),获得是一个列表
  • 领第一只:.extract_first(),获得是一个字符串
  • 择链接:
    .response.css('base::attr(href)').response.xpath('//base/@href')

正式开班

1. 新建工程 scrapy startproject tutorial

2. 创办爬虫 scrapy genspider -t basic douban douban.com

方两步会创造如下的目录结构:

Scrapy目录树

简短说下各个一个文件之意向,虽然于初识Scrapy已经说罢了。

  1. spiders文件夹存放你的爬虫,
  2. items.py用于定义存放网页数据的item。
  3. middlewares.py是后加的,目前莫欲
  4. pipelines.py 用于拍卖由spiders返回的item,比如说清洗、存储。
  5. settings.py是大局设定,比如说接下去提到的DEFAULT_REQUEST_HEADERA和USER_AGENT都以此。

3. 修改settings.py

因Scrapy非常诚实,爬取网页的当儿会标明自己是同等独爬虫,但是豆瓣不被这些表明身份的爬虫活路。所以我们不得不换个位置。

先是步:chrome用快捷键F12打开开发者工具,选择Network一栏,可能要F5刷新页面:

开发者工具的Network

老二步:在达成图吉利框部分随机挑选一个,会现出下图:

浏览器信息

咱重点需之是里给红框的Request Headers的信。

第三步:在settings.py中修改DEFAULT_REQUEST_HEADERA和USER_AGENT。

settings.py

里面的USER_AGENT填写浏览器图备受之User-Agent对承诺信息,DEFAULT_REQUEST_HEADERA里之音讯依据字典的写法,从浏览器信息图备受相继对应相应填上去。
PS:
顺便启用DOWNLOAD_DELAY=3减慢爬取速度,不要被别人的服务器增加极其多压力。
另外启用ITEM_PIPELINES = { 'tutorial.pipelines.DoubanPipeline': 300,}用以拍卖数据

4. 为此爬虫的看法看网页,

在命令执行遭输入scrapy shell https://movie.douban.com/chart
这时刻会进来scrapy版的ipython,输入view(response)不怕好翻网页。

5. 概念要爬取的内容

在items.py中作如下修改

import scrapy
class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    info = scrapy.Field()
    desc = scrapy.Field()

6. 单页逻辑

爬取多个网页前,我们首先得使水到渠成领取一个网页的音讯。在spiders/douban.py做如下修改
# –– coding: utf-8 –
import scrapy
from scrapy.http import Request
from ..items import DoubanItem

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["douban.com"]
    start_urls = (
        'https://book.douban.com/tag/%E6%BC%AB%E7%94%BB?start=0&type=T',
    )

    def parse(self, response):
        item = DoubanItem()
        for sel in response.css('#subject_list > ul > li > div.info'):
            item['title']= sel.css('h2 > a::text').extract_first()
            item['link'] = sel.css('h2 > a::attr(href)').extract_first()
            item['info'] = sel.css('div.pub::text').extract_first()
            item['desc'] = sel.css('p::text').extract_first()
            yield item

大概的爬虫就完了了。用scrapy crawl douban开始工作。由于scrap构建以python2.7上,所以对中文支持非极端好,在命令行中会为unicode编码的艺术示,所以在shell上看到同样积聚不认的\xxx也不要太操心。

7.数码存储

为好之后调用数据,我们得因此pipelines.py将爬取的数量存储在一贯的文书中。可以据此json等格式储存,也可以存放于数据库中。网页爬取数据往往无极端正统,建议以mongodb(NoSQL)。

import json
import codecs
Import pymongo #python中用来操作mongodb的库
##存储为json格式
class DoubanPipeline(object):
    def __init__(self):
        self.file = codecs.open('douban_movie.json','wb',encoding='utf-8')

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + '\n'
        self.file.write(line.decode("unicode_escape"))
        return item

class MongoPipeline(object):

    collection_name = 'douban_cartoon' # mongo的collection相当于sql的table

    def __init__(self, mongo_uri,mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    ## 配置mongo
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'), #从settings中mongo的uri
            mongo_db=crawler.settings.get('MONGO_DATABASE','douban') #从settings中获取数据库,默认为douban
        )

    # 在spider工作开始前连接mongodb
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
    ## 在spider工作结束后关闭连接
    def close_spider(self, spider):
        self.client.close()
    ## 在mongodb中插入数据
    def process_item(self, item, spider):
        # for i in item:

        self.db[self.collection_name].insert(dict(item))
        return item

运转后就可以当路所于目录找到douban_movie.json,mongodb的语需要协调失去查询了。

多页逻辑(一)

咱俩用以当时等同页获取下一个之链接,然后再次调用parse函数爬取这个链接。

     def parse(self, response):
        .....
        ## 获取下一个的链接
        href = response.xpath('//*[@id="subject_list"]/div[2]/span[4]/a')
        url = u'https://book.douban.com'+ href.css('a::attr(href)').extract_first()
        yield Request(url, callback=self.parse)

多页逻辑(二)

俺们还好透过Scrapy提供的CrawlSpider好差不多页爬取。CrawlSpider比Spider多了一如既往步就是设置Rule,具体可扣押本身的[Scrapy基础的详解Spider]的CrawlSpider。

第一步shell试错

为了保险LinkExtractor能领到到正确的链接,我们要以shell中开展试验。

scrapy shell https://book.douban.com/tag/漫画
 from scrapy.linkextractors import LinkExtractor ##导入LinkExtractor
 item=LinkExtractor(allow='/tag/漫画',restrict_xpaths=('//*[@id="subject_list"]/div[2]/span/a')).extract_links(response) ##需要反复修改

仲步修改爬虫

改后底爬虫如下:
# –– coding: utf-8 –
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from tutorial.items import DoubanItem

class ManhuaSpider(CrawlSpider):
    name = 'manhua'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/tag/漫画']

    rules = (
        Rule(LinkExtractor(allow=r'/tag/漫画',
                           restrict_xpaths=('//*[@id="subject_list"]/div[2]/span/a')),
             callback='parse_item',
             follow=True),
    )

    def parse_item(self, response):
        item = DoubanItem()
        for sel in response.css('#subject_list > ul > li > div.info'):
            item['title']= sel.css('h2 > a::text').extract_first()
            item['link'] = sel.css('h2 > a::attr(href)').extract_first()
            item['info'] = sel.css('div.pub::text').extract_first()
            item['desc'] = sel.css('p::text').extract_first()
            yield item

运行结果以及多页逻辑(一)的一模一样。


更进一步,你可以关押再次认识Scrapy-下充斥豆瓣图书封面,在斯的根基及添图下充斥功能。
假若怕给ban,可以看再识Scrapy-防ban策略


本文参考了Andrew_liu的Python爬虫(六)–Scrapy框架上,
scrapy研究探索(二)——爬w3school.com.cn,以及最着重之合法文档。


写于末:
网及出那基本上之Scrapy的课程,为甚我还要写一个为?因为自身觉着确实学会用好语言去抒发相同家技术之上,才好不容易入门了。
再有写出来的物才能够吃他人发现自己的阙如,希望各位大大批评指正。
自之源代码托管在GitHub高达,有需要的话可以错过押

相关文章

网站地图xml地图