小爬爬7:回顾&&crawlSpider

1.回顾昨日内容

回顾
- 全站数据爬取(分页)
    - 手动请求的发送Request(url,callback)
- post请求和cookie处理
    - start_requests(self)
    - FromRequest(url,callback,formdata)
    - cookie操作是自动处理

- 请求传参
    - 使用场景:
    - 实现:scrapy.Request(url,callback,meta={'':''})
            callback:response.meta['']
- 中间件
    - 下载中间件:批量拦截所有的请求和响应
    - 拦截请求:UA伪装(process_request),代理ip(process_exception:return request)
    - 拦截响应:process_response

2.crawl总结

- CrawlSpider
    作用:就是用于进行全站数据的爬取
    - CrawlSpider就是Spider的一个子类
    - 如何新建一个基于CrawlSpider的爬虫文件
        - scrapy genspider -t crawl xxx www.xxx.com
    - LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取
    - Rule规则解析器:将链接提取器提取到的链接进行请求发送,然后对获取的页面数据进行
        指定规则(callback)的解析
    - 一个链接提取器对应唯一一个规则解析器

3.高效的全栈数据爬取

新建一个抽屉的项目,我们对其进行全栈数据的爬取

 

 

下图是页码对应的url

 

 

 

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class ChoutiSpider(CrawlSpider):
    name = 'chouti'
    # allowed_domains = ['www.xxx.com']
    #抽屉的第一页链接
    start_urls = ['https://dig.chouti.com/all/hot/recent/1']
    #全栈数据爬取是将所有页码依次请求发送
    #链接提取器:从起始url对应的页面中提取符合规则的链接,allow==>正则表达式
    link=LinkExtractor(allow=r'/all/hot/recent/\d+')
    rules = (
        #规则解析器,可以有多个规则:将链接提取器提取到的链接对应的页面源码进行制定规则的解析
        Rule(link, callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        # item = {}
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()
        # return item
        print(response)

修改下面的内容:

LOG_LEVEL='ERROR'

 下面我们提取指定的规则执行下面的命令:

运行之后,我们只是爬取到了10条数据

我们需要将最后一个界面作为起始,也就是follow=True就可以了

再次运行下面的命令:

 

运行上边的命令,我们就成功取到120页的数据.

 

自己理解这句话:

follow:True将链接提取器继续作用到链接提取器链接对应的页面源码中,

 

 新的需求:

 

 4.crawlSpider深度爬取

案例:阳光热线,我们解析出首页的对应"标题"和详情页中的"段落"

 2个链接提取器和2和规则解析器

 (1)下面第一步,我们需要新建一个工程

 

 

 

 添加UA和修改robot协议为false

 

 注释allowed_domains,并且将起始url写在start_urls里边

阳光热线的第一页:http://wz.sun0769.com/index.php/question/report?page=

看一下,我们如何取到源码的链接:

 

 

我们看到的是页码中的数据是30的倍数,对比我们看到了这个发生了变化

 

 

修改follow=False,只爬取前五页,原因是数据量太大

 

 

 我们需要拿到table的xpath解析,注意要修改tbody,再拿到下面的tr

 

 

 执行程序

 

posted @ 2019-06-04 23:34  studybrother  阅读(166)  评论(0编辑  收藏  举报