Python分布式爬虫打造搜索引擎


一、scrapy进阶开发

1、selenium相关学习:https://www.cnblogs.com/Eric15/p/9884309.html

2、selenium集成到scrapy中

 下载中间件的process_request和process_response方法

  ①、process_request:每个交给下载器的request对象都会经过该方法,并期望返回response(每爬取一个url前,都会执行此方法)

  ②、 process_response:当下载器完成http请求,返回响应给引擎的时候调用

对一些动态网站,获取数据时采用selenium/phantomjs实现。集成selenium到scrapy框架中,只需要在middleware.py中新建中间件类,在其中实现process_request方法就可以了:

# middleware.py
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):#通过selenium - chrome请求动态网页def process_request(self, request, spider):# 每次进行url请求时,都会调用此方法(前提setting中需配置)if spider.name == "jobbole":  # 爬取伯乐时执行# browser = webdriver.Chrome(executable_path="C:/chromedriver.exe")spider.browser.get(request.url)import timetime.sleep(3)print ("访问:{0}".format(request.url))# 返回HtmlResponse,可以结束当条爬虫对下载中间件中其他类的执行,return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)  #HtmlResponse中这几个参数都是必须的,固定写法
process_response(self):# 每条数据爬取完成后调用pass

关于控制浏览器打开关闭,可在爬虫主文件处理。首先需引人dispatcher/sigals

dispatcher.connect:信号的映射

 导入:from scrapy.xlib.pydispatch import dispatcher

signals:信号量,非常重要

 导入:from scrapy import signals

使用:

from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals#使用seleniumdef __init__(self):# 会将driver封装进spider中self.browser = webdriver.Chrome(executable_path="D:/Temp/chromedriver.exe")super(JobboleSpider, self).__init__()# 信号的映射,spider_closed:当爬虫结束时执行self.spider_closed方法
        dispatcher.connect(self.spider_closed, signals.spider_closed)def spider_closed(self, spider):#当爬虫退出的时候关闭chromeprint ("spider closed")self.browser.quit()

setting.py中配置:

DOWNLOADER_MIDDLEWARES = {
'ArticleSpider.middlewares.JSPageMiddleware': 1,#    'ArticleSpider.middlewares.RandomUserAgentMiddlware': 543,
#    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}

需要注意的是:以上述方式运行爬虫相关,当执行到selenium相关操作部分时,便不再是异步操作而是同步的了。当然,也可以通过twisted集成实现异步操功能。


3、scrapy的暂停与重启

前提:进入爬虫目录

启动/重启爬虫:

scrapy crawl jobbole -s JOBDIR=jobs/001

JOBDIR=jobs/001:启动爬虫时,新建jobs/001目录,用于保存中间态信息;重启爬虫时,会读取001目录中相关信息,进行后续的数据爬取

暂停爬虫:ctrl + c ,按一次表示暂停,按两次表示强制结束。pycharm中没有此功能,一般在终端运行。

jobs/001目录:开始爬取数据后,001目录下会生成如下文件:

在requests.queue目录下也生成两个文件:

文件名 类型 用处
request.seen 文件 已经访问过的url
spider.state 文件 spider的状态信息
requests.queue 文件夹 request队列
requests.queue/p1 文件 需要继续做完的request

注意:

  • JOBDIR目录下主要是保存中间态信息
  • 不同的spider不能共用同一个目录(另生成目录001、002、003等)
  • 不同的run不能共用同一个目录
  • 不能用kill -9 main.py 命令强制结束爬虫
  • 正常退出使用ctrl+c(只能按一次,按完需要一段时间处理中间状态)

4、scrapy的数据收集

document:https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/stats.html

[以下是文档概述-scrapy数据收集]

数据收集(Stats Collection)

 Scrapy提供了方便的收集数据的机制。数据以key/value方式存储,值大多是计数值。 该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 stats 来使用。在下面的章节 常见数据收集器使用方法 将给出例子来说明。

无论数据收集(stats collection)开启或者关闭,数据收集器永远都是可用的。 因此您可以import进自己的模块并使用其API(增加值或者设置新的状态键(stat keys))。 该做法是为了简化数据收集的方法: 您不应该使用超过一行代码来收集您的spider,Scrpay扩展或任何您使用数据收集器代码里头的状态。

 数据收集器的另一个特性是(在启用状态下)很高效,(在关闭情况下)非常高效(几乎察觉不到)。

 数据收集器对每个spider保持一个状态表。当spider启动时,该表自动打开,当spider关闭时,自动关闭。

可用的数据收集器

 除了基本的 StatsCollector ,Scrapy也提供了基于 StatsCollector 的数据收集器。 您可以通过 STATS_CLASS 设置来选择。默认使用的是 MemoryStatsCollector

常见数据收集器的使用方法(通过 stats 属性来使用数据收集器),具体请参考上述文档链接


demo:

 爬取伯乐在线文章,截获404,将抓取到的404页面的次数添加到数据收集器中(stats)

在jobbole.py中编写代码:

#收集伯乐在线所有404的url以及404页面数
handle_httpstatus_list = [404]

 scrapy中默认是会过滤掉有问题的HTTP response,除了状态码为200-300的请求及response会被处理外,其他状态码均会被默认过滤掉,不做处理。我们要截获404错误页面,通过response.status == 403判断是没有的,需要使用

handle_httpstatus_list=[404],此时能截获到404页面进行处理(200-300 、404页面给予处理),后面才能根据状态码来判断是否爬取的是404页面,然后才能将数据收集到数据收集器中。

实现每捕获一个404页面,就让数据收集器里的failed_url +1:

class JobboleSpider(scrapy.Spider):name = "jobbole"allowed_domains = ["blog.jobbole.com"]start_urls = ['http://blog.jobbole.com/all-posts/']#收集伯乐在线所有404的url以及404页面数handle_httpstatus_list = [404]def parse(self, response):# 捕获到404页面,stats中failed_url数据+1if response.status == 404:self.fail_urls.append(response.url)self.crawler.stats.inc_value("failed_url")  #stats是存在于crawler中的

......


5、scrapy的信号

document:https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/signals.html



二、scrapy-redis 分布式爬虫

1、scrapy-redis概述

 1)scrapy本身是个通用的爬虫框架,但并不支持分布式爬虫模式。要使用分布式爬虫,则需要使用到scrapy-redis爬虫组件,scrapy-redis提供了一些以redis为基础的组件(仅有组件)。

 2)分布式爬虫的优点:

  1. 可以充分利用多台机器的带宽
  2. 可以充分利用多台机器的ip地址
  3. 多台机器做,爬取效率更高

 3)分布式爬虫必须要解决的问题:

  1. 分布式爬虫是好几台机器在同时运行,如何保证不同的机器爬取页面的时候不会出现重复爬取的问题?
  2. 同样,分布式爬虫在不同的机器上运行,在把数据爬取完成后如何保证保存在同一个地方?

2、scrapy-redis 安装

pip install scrapy-redis

 

3、redis相关操作参考:https://www.cnblogs.com/Eric15/articles/9459329.html


4、将scrapy项目变成scrapy-redis项目:

1)将爬虫继承的类:scrapy.Spider,变成继承:scrapy_redis.spiders.RedisSpider ; 如果继承的是scrapy.CrawlSpider类,则变成继承:scrapy_redis.spiders.RedisCrawlSpider。

2)将爬虫中的start_urls删掉/注释,增加redis_key="xxx"。作用:用于控制爬虫启动,爬虫的第一个url就是在redis中通过这个redis_key发送出去的

#demo:
redis_key = "sina_guide:strat_urls" 

3)在配置文件中增加以下配置:

# 使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis里的调度器组件,不使用默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True
# 默认的scrapy-redis请求队列形式(按优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"# 只是将数据放到redis数据库,不需要写pipelines文件
ITEM_PIPELINES = {
#    'Sina.pipelines.SinaPipeline': 300,'scrapy_redis.pipelines.RedisPipeline': 400,
}# LOG_LEVEL = 'DEBUG'   # 日志打印等级# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
# DOWNLOAD_DELAY = 1   # 爬虫延迟时间
# 指定数据库的主机IP
REDIS_HOST = "192.168.13.26"
# 指定数据库的端口号
REDIS_PORT = 6379

运行爬虫时:

 1)在爬虫服务器上,进入爬虫文件所在的路径,输入运行命令:scrapy runspider [爬虫文件名]↓

#demo:
scrapy runspider sina.py

 2)在Redis服务器上,推入一个开始的url链接:redis-cli(客户端进入);推入链接:lpush [redis_key] start_url ,开始爬取↓

#demo:
redis-cli> lpush sina_guide:start_urls http://news.sina.com.cn/guide/  # sina_guide:start_urls 需与上面的start_urls 保持一致


转载于:https://www.cnblogs.com/Eric15/articles/9961246.html

Python分布式爬虫打造搜索引擎(四)相关推荐

  1. Python分布式爬虫打造搜索引擎

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自 ...

  2. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  3. 学习python-day02-24---转自Python分布式爬虫打造搜索引擎Scrapy精讲

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  4. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  5. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查...

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  6. 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中...

    Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...

  7. 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念...

    第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的基本概念 elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点 ...

  8. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图...

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  9. 学习python-day02-25---转自Python分布式爬虫打造搜索引擎Scrapy精讲

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  10. 三十五 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题 转载于:https://www.cnblogs.com/meng-wei-zhi/p/8182813.html

最新文章

  1. lgg6 android 9,【LGG6评测】18:9奇葩比例没采用骁龙835 LG G6解析_LG G6_手机评测-中关村在线...
  2. python-正则表达式练习题
  3. Nature微生物多样性驱动了细菌以CRISPR系统抵御噬菌体
  4. python telnet 交互_用Python怎么telnet到网络设备
  5. kafka是存储到本地磁盘么_【漫画】Kafka是如何实现高性能的?
  6. 首发 | 中间件小姐姐直播“带货”——阿里程序员必知的插件
  7. Java笔记06-Map集合
  8. tomcat 错误页面html,Nginx整合Tomcat后配置友好错误界面
  9. 想辞职专心做自媒体可以吗?有哪些建议吗?
  10. 88.http反向代理proxy处理请求的流程
  11. mysql学生成绩视图_mysql的视图
  12. HDU1555 How many days?【水题+模拟】
  13. shiro框架java使用
  14. 【爆赞】这款Python小程序自动抠图只需5秒,秒杀PS手动抠图?
  15. git查看commit提交记录详情
  16. Ola VS Uber:从印度到伦敦的出行战争
  17. VBlog项目代码理解之后端
  18. 利用sitemap提交漏洞劫持其它网站排名
  19. Ubuntu16.04安装bugzilla
  20. 愤怒的小鸟 高清完整版下载

热门文章

  1. NYOJ--12--喷水装置(二)
  2. 程序员面试 IT 公司,这些地方你要注意!
  3. 正则表达式在 ES2018 中的新写法
  4. 青海省多种食品、农产品实现首次出口
  5. 重拾React: React 16.0
  6. excel函数学习系列一
  7. 理解 Visual C++ 应用程序的依赖项(msdn)
  8. checkbox 在jsp中的使用
  9. 和is哪个好_眼霜哪个牌子好用?这些品牌的眼霜睡前涂一涂,黑眼圈细纹没有了...
  10. 15.MongoDB的一致性(读关注与写关注)