一。首先配置

1.scrapy
2.selenium
3.webdriver
4.浏览器Firefox
具体的安装可以去这个兄弟的博客看看https://blog.csdn.net/azsx02/article/details/68947429

注意:这是重点
webdriver在github上下载需要翻墙,还有selenium+webdriver+Firefox的版本问题,这么说吧,scrapy通过selenium下的webdriver(很遗憾它需要另行下载)去超控浏览器Firefox,webdriver是要与浏览器连接吧,如果webdriver的版本与Firefox不对应,就相当于你用安卓充电器去冲苹果手机,插都插不进去,还冲个屁。

二。scrapy爬取过程

Scrapy 中的数据流用执行引擎控制,其过程如下:

1,引擎打开一个网站(open a domain ),找到处理该网站的spider.py并向该spider请求第一个要爬取的URL.
(engine就相当于你的的大脑,你要爬出去寻找猎物了,首先你得确定一个区域(allowed_domains)是安全的,于是你就在这个scrapy文件中的spider.py文件中找到了它,所有你打开了spider.py,并且按顺序执行其中的命令,首先打开可执行的区域网站,紧接着你想打开第一个爬取的目标网址url,于是你就生成了一个请求(request))

2,引擎从spider中获取第一个要爬取的URL并在调度器中schedule调度
(spider.py只是你的身体,你生成请求得由你的大脑engine去发送给调度器schedule(就是一先进先出队列),先存着,等下调用。好比说你要去超市买东西,牙膏,洗发露,卫生纸都是你的请求request,你不得先把它们记住,然后到超市在执行啊,schedule相当于大脑的指令缓存的区域)

3,引擎向调度器返回下一个要爬取的URL
(你到超市了,这个时候你就把你之前存的指令一个一个按顺序调出来执行,所以说为啥要弄一个schedule,就是为了缓存你的指令)

4,调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载器中间件Downloader middleware(请求request的方向)转发给下载器
(下载器中间件就是你的眼睛,你去超市要买东西,你要不要用眼睛去找一下吧,你还得看一下啥牌子,啥价格再买不是。所以说在把整个页面源代码现在下来之前我们得通过整个下载器中间件判断一下,这个页面可不可以下载,符不符合要求,所以说下载器中间键是设定在请求执行前,因此可以设定代理,请求头,cookie等)

5,一旦页面下载完毕,下载器就生成一个该页面的response,并通过下载器中间件(返回response的方向)发送给引擎
(下载器就把整个页面的源代码下载下来,生成一个可以直接获得源代码的响应response,给爬虫,相当于你在超市挑选完你要买的东西后,
付钱(Downloader)阿姨就把你的商品response给你)

6,引擎 从下载器接收到response并通过spider中间件(输入方向)发送给spider处理
(Spider中间件处理的是即将发往Spider处理的Response对象,以及从Spider返回的Response对象或Item对象。好比说你买完东西回去了,在路上发现买的东西有点小小的瑕疵,于是你就通过Spider中间件操作一下,弄好了,问题不大)

7,spider处理response并返回爬取到的Item及新的request给引擎
(spider接收到response开始对它有用的部分进行提取也就是你的item,通过yield生成对象,有时候yield生成item,那就直接给itempipline处理了,有时候你要生成request,比如在多级页面的爬取当中,这个时候你要把这个request发给调度器。这就相当于你买完东西回到宿舍开始把牙膏拆开,外壳丢掉,牙膏给pipline存起来,如果发现没买牙杯于是又把这个买牙杯的request发送给调度器,等下次去超市的时候买)
8,引擎将(spider返回的)request给调度器。

9,(从大二步)重复知道调度器没有更多的request,引擎关闭该网站

三。selenium+webdriver+Firefox主要为了解决一个什么样的问题呢?它的执行过程是什么呢?

想要爬取由js生成的页面,就拿腾讯新闻首页来说吧,整个HTML页面的数据基本由js生成,我使用scrapy shell https://news.qq.com/,检查页面的反爬取,通过
view(response)打开网页发现是空白网页,再观察浏览器中它的源代码页面都没有要爬取的内容,可以判定它的页面由js生成。常规的方法根本不能爬取它的页面,所以使用scrapy通过selenium下的webdriver(很遗憾它需要另行下载)去控制浏览器Firefox进入你要爬取的页面,把这个由它js生成页面的HTML给返回来这个HTML和他的源代码可不一样,源代码都是js脚本,而它里面有我们需要爬取的内容。

四。案例

要爬取的网站https://news.qq.com/
内容:几日要闻下面的五个标题+每个标题里面的内容
1。spider.py文件

import scrapy
from selenium import webdriver#用于操作浏览器
from scrapy import signals#用于爬虫运行结束时发信号
from scrapy.xlib.pydispatch import dispatcher#用于把浏览器关闭函数和爬虫结束运行联系在一起
from qqn.items import QqnItemclass QqnSpider(scrapy.Spider):
name = 'qqn'#爬虫的名字
allowed_domains = ['news.qq.com']#可允许被爬取的域名
start_urls = ['http://news.qq.com/']#开始爬取的urldef __init__(self):'''浏览器设置'''self.browser = webdriver.Firefox()#实例化一个浏览器操作对象super(QqnSpider,self).__init__()#然后把类QqnSpider的对象self转换为它父类的对象,然后用这个对象来调用自己的__init__函数.dispatcher.connect(self.spider_closed, signals.spider_closed)#这个函数的功能是在爬虫运行完毕后,自动调用spider_closed函数来关闭浏览器def spider_closed(self,spider):'''整个程序运行结束关闭浏览器:param spider::return:'''print('close spider')self.browser.quit()def parse(self, response):item = QqnItem()lis = response.xpath('//ul[@class="list top-list"]/li')#定位要爬取内容到容器i = 0for li in lis:i = i+1item['title_{}'.format(i)] = li.xpath('div/h3/a/text()').extract()#'title_{}'.format(i)——这个是用i去替换{}的位置item['href_{}'.format(i)] = li.xpath('div/h3/a/@href')[0].extract()yield scrapy.Request(url=item['href_{}'.format(i)], meta={"item": item},callback=self.parse_detail, dont_filter=True)#这里是生成(yield)了一个request请求,请求的内容是url连接和meta数据,meta数据保存着item数据的所有内容,通过callback传给parse_detail进行下一步的解析,并且声明dont_filter=True,使得url不能重复def parse_detail(self, response):item = response.meta['item']#item接收由上面函数返回到这个函数请求数据中的meta['item'],类似于继承,它既可以有上个函数属性(上个函数的item是QqnItem类的实例化),又得到了它的所有数据content = response.xpath('//div[@class="content-article"]/p/text()').extract()#对二级页面的文本进行提取,这里提取的是所有的段落内容,注意提取完后它是一个listitem['article'] = contentyield item

2。item.py

import scrapy
class QqnItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title_1 = scrapy.Field()title_2 = scrapy.Field()title_3 = scrapy.Field()title_4 = scrapy.Field()title_5 = scrapy.Field()href_1 = scrapy.Field()href_2 = scrapy.Field()href_3 = scrapy.Field()href_4 = scrapy.Field()href_5 = scrapy.Field()article = scrapy.Field()

3。middleware.py

from scrapy import signals
import time
from scrapy.http import HtmlResponseclass JSPageMiddleware(object):
def process_request(self, request, spider):'''方法中的参数一定不要改,因为这个方法就是来处理request 请求:param request::param spider::return:  browser 解析过后的url, 得到的页面给解析函数中的 def parse(self, response) 来处理'''#  如果是我们需要的项目名称,就会把 spider 里面的 request 带过来if spider.name == 'qqn':print(request.url)# 这里的 spider.browser 会调用我们在解析函数里面写的 webdriverspider.browser.get(request.url)#get函数去控制浏览器进去我们要爬取的页面time.sleep(2)#等待2秒return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding='utf-8',request=request)#把这个页面的HTML页面返回给Downloader下载,注意    body=spider.browser.page_source,#这就是获取到浏览器当前的页面的HTML

4。setting.py

DOWNLOADER_MIDDLEWARES = {
# 'qqn.middlewares.NqDownloaderMiddleware': 543,
'qqn.middlewares.JSPageMiddleware': 4}

5。然后就。。。。。。。。。成功了呗
当然了你要保存的时候注意了,那个item[‘article’]里面的内容是list

用scrapy+selenium+Firefox爬取腾讯新闻相关推荐

  1. Python+Scrapy爬取腾讯新闻首页所有新闻及评论

    前言 这篇博客写的是实现的一个爬取腾讯新闻首页所有的新闻及其所有评论的爬虫.选用Python的Scrapy框架.这篇文章主要讨论使用Chrome浏览器的开发者工具获取新闻及评论的来源地址. Chrom ...

  2. 使用selenium自动化爬取腾讯研究院报告

    使用selenium自动化爬取腾讯研究院报告 需要用到的库:docx(需要pip install python-docx,不然有些函数无法使用).re.requests.lxml.selenium.t ...

  3. 爬取腾讯新闻中省份疫情数据到Mysql数据库

    爬取腾讯新闻中省份疫情数据到Mysql数据库 本人是一个中职学生,第一次发表自己所学到技术-- 本篇文章所用到的语言及工具等: python 3.8 pycharm Mysql Navicat Pre ...

  4. Python番外篇:爬取腾讯新闻热点内容 并发送新闻提示电子邮件

    hello,大家好,我是wangzirui32,今天来教大家如何爬取爬取腾讯新闻热点内容,并发送新闻提示电子邮件,开始学习吧! 1. HTML解析 腾讯网的首页为https://www.qq.com, ...

  5. python爬取腾讯新闻_Python 实现腾讯新闻抓取

    原博文 2012-08-14 09:56 − 思路: 1.抓取腾讯新闻列表页面: http://news.qq.com/ 2.提取详细页面的url:http://news.qq.com/a/20120 ...

  6. scrapy + selenium + chromedriver爬取动态数据

    scrapy是一个网页爬虫框架 安装scrapy 推荐使用Anaconda 安装 Anaconda 安装介绍 http://www.scrapyd.cn/doc/124.html 安装后需要配置 清华 ...

  7. 跌跌撞撞尝试Scrapy+Selenium+MySQL爬取与存储东方财富网股票数据

    目录 网页信息 爬虫框架 stock_spider.py(爬虫文件) items.py (爬取字段命名) middlewares.py(Selenium中间件) pipelines.py settin ...

  8. 用scrapy+selenium + phantomjs 爬取vip网页,保存为json格式,写入到mysql数据库,下载图片(二)

    接上一编 weipin.py文件的代码 : # -*- coding: utf-8 -*- import scrapy from weipinhui.items import WeipinhuiIte ...

  9. Windows下利用python+selenium+firefox爬取动态网页数据(爬取东方财富网指数行情数据)

    由于之前用urlib和request发现只能获取静态网页数据,目前爬取动态网页有两种方法, (1)分析页面请求 (2)Selenium模拟浏览器行为(霸王硬上弓),本文讲的就是此方法 一.安装sele ...

最新文章

  1. 【OpenCV 4开发详解】轮廓面积与长度
  2. 统一用户及权限管理系统
  3. Stack Overflow被腾讯最大股东收购,影响我复制粘贴代码吗?
  4. 第一章 基础算法 【完结】
  5. mysql user_tab_cols_最新Oracle 和 mysql 的对比参照----开发篇(转)
  6. 从代码内部:骆驼路由引擎第一部分
  7. java学习(110):日期date类
  8. 连续赋值与求值顺序var a = {n:1};a.x = a = {n:2}; alert(a.x);
  9. oracle11gR版本GI中新增,Oracle11g新特性MemberKillEscalation简介
  10. 延时函数、数码管显示头文件(单片机)
  11. 诗与远方:无题(九)
  12. 知识点笔记(二维数组排序、统计数组重复个数、)
  13. python二维游戏编程 最强大脑游戏_看完《最强大脑》,我决定用Python做这个游戏...
  14. HTMl悬浮播放器XPlayer,XPlayer万能视频播放器
  15. linux之hugepage
  16. 百度的搜索引擎相关技术的分析
  17. 宜宾学院谢江宜计算机基础题,宜宾学院2011-2012学年度下期期末公共课考试安排表.xls...
  18. 离散数学 数学三大危机
  19. colorFormat颜色转换插件
  20. C#调用硬件设备开发流程

热门文章

  1. 洛谷 Cantor 表
  2. js下载文件防止白屏
  3. Flutter 布局 - UI - 官方文档 - 学习速记(一)
  4. Redis Cluster 添加/删除 完整折腾步骤
  5. Laravel OAuth2 (二) ---配置与数据库设计
  6. docker安装和基础使用
  7. C# asp.net 连接 Sql Server数据库 Timeout expired. 错误,怎么办?
  8. vim常用插件安装及使用
  9. 微信小程序调用地图和跟据经纬度打开手机地图导航
  10. 50个Java多线程面试题