博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫第七章 scrapy中间件 + 基于crawlSpider全站爬取网络数据
阅读量:6756 次
发布时间:2019-06-26

本文共 4474 字,大约阅读时间需要 14 分钟。

scrapy中间件

scrapy中间件分为两种:    一种是:下载器和引擎之间的下载器中间件        作用: 处于引擎和下载器之间,此中间件可以拦截整个工程中发起的请求和响应数据    另一种是: 爬虫程序跟引擎之间的下载器中间件拦截请求干什么?    代理ip : request.meta['proxy'] = 'http://ip:port'    UA伪装 : request.headers['User-Agent'] = 'xxxxxx'拦截响应干什么?    篡改响应数据 (基本上不会对响应数据进行修改)    更换响应对象 (基本上就是用来更改代理ip) 在scrapy中使用selenium   在爬虫类中定义一个bro属性(selenium实例化的一个浏览器对象)   在爬虫类中重写一个closed(self,spider),在该方法中关闭浏览器对象   在中间件的process_response中通过spider参数爬取爬虫类中的bro属性   在中间件中编写浏览器自动化操作获取页面源码数据   将页面源码数据作为新响应对象的响应数据   将新的响应对象返回

基于crawlSpider的全站数据爬取

crawlSpider和Spider之间的关联    crawlSpider是Spider的一个子类创建一个基于crawlSpider的爬虫文件    scrapy genspider -t crawl pcpro www.xxx.com

实例代码:

爬虫文件代码:

import scrapyfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Rulefrom sunShinePro.items import SunshineproItem,sunConetent# http://wz.sun0769.com/index.php/question/questionType?type=4&page=30class SunSpider(CrawlSpider):    name = 'sun'    # allowed_domains = ['www.xxx.com']    start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']    #链接提取器        #作用:根据 指定的规则(allow:正则) 提取页面源码中指定的连接    link = LinkExtractor(allow=r'type=4&page=\d+')    link_detail = LinkExtractor(allow='question/\d+/\d+\.shtml')    rules = (        #规则解析器:将连接提取器提取到的连接对应的页面源码数据 根据指定规则(callback) 进行数据解析        Rule(link, callback='parse_item', follow=False),        Rule(link_detail, callback='parse_detail'),    )    def parse_detail(self,response):        content = response.xpath('/html/body/div[9]/table[2]//tr[1]/td/div[2]//text()').extract()        content = ''.join(content)        item = sunConetent()        item['content'] = content        yield item    def parse_item(self, response):        #注意:如果xpath定位的标签中存在tbody,则需要跳过tbody        tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')        for tr in tr_list:            title = tr.xpath('./td[2]/a[2]/text()').extract_first()            status = tr.xpath('./td[3]/span/text()').extract_first()            item = SunshineproItem()            item['title'] = title            item['status'] = status            yield item

pipelines.py中

class SunshineproPipeline(object):    def process_item(self, item, spider):        if item.__class__.__name__ == 'SunshineproItem':            print(item['title'], item['status'])        else:            print(item['content'])        return item

记得要在settings.py中打开管道

spider和selenium一起使用

实例代码:

爬虫文件代码.py

import scrapyfrom selenium import webdriverclass WangyiSpider(scrapy.Spider):    name = 'wangyi'    # allowed_domains = ['www.xxx.com']    start_urls = ['https://news.163.com/world/']    #实例化一个浏览器对象    bro = webdriver.Chrome(executable_path=r'C:\Users\old-boy\Desktop\爬虫\day05爬虫\chromedriver.exe')    def parse(self, response):        div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div/div/ul/li/div/div')        for div in div_list:            title = div.xpath('.//div[@class="news_title"]//a/text()').extract_first()            detail_url = div.xpath('.//div[@class="news_title"]//a/@href').extract_first()            yield scrapy.Request(detail_url,self.parse_detail)            print(title,detail_url)    def parse_detail(self,response):        content = response.xpath('//*[@id="endText"]//text()').extract()        content = ''.join(content)        print(content)    def closed(self,spider):        self.bro.quit()

middlewares.py中

class WangyiproDownloaderMiddleware(object):    #spider表示的就是爬虫类实例化的对象    def process_response(self, request, response, spider):        #将不符合需求的响应对象修改成符合需求的        #body:响应数据        #如何获取爬虫类中生成的浏览器对象呢?        if request.url == 'https://news.163.com/world/':            bro = spider.bro            bro.get('https://news.163.com/world/')            sleep(2)            #滚动条滚动到最底部            bro.excute_script('window.scrollTo(0,document.body.scrollHeight)')            sleep(1)            bro.excute_script('window.scrollTo(0,document.body.scrollHeight)')            sleep(1)            bro.excute_script('window.scrollTo(0,document.body.scrollHeight)')            sleep(1)            page_text = bro.page_source            new_response = HtmlResponse(url=bro.current_url,body=page_text,encoding='utf-8',request=request)            return new_response        else:            return response #一定要返回原始数据,否则只能获取到一部分内容

在settings.py中我们要配置以下参数:

#下载器和引擎之间的中间件 DOWNLOADER_MIDDLEWARES = {   'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,}

 

转载于:https://www.cnblogs.com/zty1304368100/p/11055203.html

你可能感兴趣的文章
apache站点稍大文件不完整原因及解决
查看>>
python的reduce函数
查看>>
细读shell-6
查看>>
ubuntu11.10安装php mysql wordpress
查看>>
一、2 基于wsgiref定义自己的web框架
查看>>
Ubuntu Server14.04 32位安装odoo8.0简单方法
查看>>
jQuery-easyui下的多表关联的增删改操作
查看>>
C库函数学习笔记之strstr
查看>>
我的友情链接
查看>>
大数据采集、清洗、处理:使用MapReduce进行离线数据分析完整案例
查看>>
java中的自动装箱和自动拆箱
查看>>
手动创建数据库操作步骤
查看>>
yum配置与使用
查看>>
Spring+Struts 2 简单实例报空指针异常
查看>>
正则表达式测试器
查看>>
innobackupex 部分表恢复
查看>>
兼容IE,Firefox,CSS3 opacity透明度
查看>>
读取Hive中所有表的表结构,并在新Hive库中创建表,索引等
查看>>
XenServer部署系列之02——系统安装及许可
查看>>
linux下FTP服务器搭建
查看>>