小爬爬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
执行程序