selenium、UA池、ip池、scrapy-redis的综合应用案例
案例:
网易新闻的爬取:
爬取的内容为一下4大板块中的新闻内容
爬取:
特点:
动态加载数据 ,用 selenium
爬虫
1. 创建项目
scrapy startproject wy
2. 创建爬虫
scrapy genspider wangyi www.wangyi.com
撰写爬虫
1. 获取板块url
- import scrapy
- class WangyiSpider(scrapy.Spider):
- name = 'wangyi'
- # allowed_domains = ['www.wangyi.com']
- start_urls = ['https://news.163.com/']
- def parse(self, response):
- # 获取4大板块的url 国内、国际、军事、航空
- li_list = response.xpath("//div[@class='ns_area list']/ul/li")
- item_list =[]
- for li in li_list:
- url = li.xpath("./a/@href").extract_first()
- title = li.xpath('./a/text()').extract_first().strip()
- # 过滤出 国内、国际、军事、航空
- if title in ['国内','国际','军事','航空']:
- item = {}
- item['title'] = title
- item['url'] = url
- print(item)
1.过滤出想要板块的url和板块名爬虫
settings.py 文件中:
- # Obey robots.txt rules
- ROBOTSTXT_OBEY = False
执行爬虫效果
2. 每个板块页面的爬取:
爬虫代码:
- # 提取板块中的数据
- def parse_content(self,response):
- title = response.meta.get('title')
- div_list =response.xpath("//div[@class='ndi_main']/div")
- print(len(div_list))
- for div in div_list:
- item={}
- item['group'] = title
- img_url = div.xpath('./a/img/@src').extract_first()
- article_url = div.xpath('./a/img/@href').extract_first()
- head = div.xpath('./a/img/@alt').extract_first()
- keywords = div.xpath('//div[@class="keywords"]//text()').extract()
- # 将列表内容转换成字符串
- content = "".join([i.strip() for i in keywords])
- item['img_url'] = img_url
- item['article_url'] = article_url
- item['head'] = head
- item['keywords'] = keywords
- yield scrapy.Request(
- url=article_url,
- callback=self.parse_detail,
- meta={'item':copy.deepcopy(item)}
- )
启动爬虫时没有打印出结果:
用xpath help 插件检查,发现所写的xpath表达式没有错,说明,该页面的数据可能是动态加载的数据
xpath显示有数据
解决动态数据使用selenium:
scrapy 中使用selenium 爬取步骤:
1. 在爬虫类中,重新构造方法 __init__,和写爬虫结束时关闭浏览器
2. 在下载中间键中
- from scrapy.http import HtmlResponse
- class WyDownloaderMiddleware(object):
- def process_request(self, request, spider):
- return None
- def process_response(self, request, response, spider):
- # 拦截 响应
- if request.url in [ 'http://news.163.com/domestic/','http://news.163.com/world/','http://war.163.com/','http://news.163.com/air/']:
- spider.bro.get(url=request.url)
- js = 'window.scrollTo(0,document.body.scrollHeight)'
- spider.bro.execute_script(js)
- time.sleep(3)
- page_text=spider.bro.page_source
- return HtmlResponse(url=spider.bro.current_url,body=page_text,encoding='utf-8')
- else:
- return response
3. settings.py中,开启下载中间件
- # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
- DOWNLOADER_MIDDLEWARES = {
- 'wy.middlewares.WyDownloaderMiddleware': 300,
- }
UA池
1.在中间中自定义一个user_agent 中间件类 ,继承UserAgentMiddleware
- #单独给UA池封装一个 下载中间件的类
- # 需要导包 userAgentMiddleware
- class RandomUserAgent(UserAgentMiddleware):
- '''
- UA池类
- # 用faker 模块进行随机生成一个user_agent
- '''
- def process_request(self, request, spider):
- fake = Factory.create()
- # 通过 faker模块随机生成一个ua
- user_agent = fake.user_agent()
- request.headers.setdefault('User_Agent',user_agent)
2. 在settings.py 配置文件中:
- DOWNLOADER_MIDDLEWARES = {
- 'wy.middlewares.WyDownloaderMiddleware': 300,
- 'wy.middlewares.RandomUserAgent': 543,
- }
IP池
1. 中间件中:
- # 批量对拦截到的请求对ip 进行更换 ,自定义一个ip代理类
- class Proxy(object):
- def process_request(self,request,spider):
- # 两种 ip 池
proxy_http=['206.189.231.239:8080','66.42.116.151:8080']
proxy_https=['113.140.1.82:53281','36.79.152.0:8080']
# request.url 返回值 :http://www.xxx.com 或 https://www.xxx.com
h = request.url.split(":")[0]- if h=="http:":
ip = random.choices(proxy_http)
request.meta['proxy']='http://'+ip
else:
ip = random.choices(proxy_https)
request.meta['proxy'] = 'https://'+ip
2. settings.py 配置
- DOWNLOADER_MIDDLEWARES = {
'wy.middlewares.WyDownloaderMiddleware': 543,
'wy.middlewares.RandomUserAgent': 542,
'wy.middlewares.Proxy': 541,
}
改为分布式爬虫
1. redis 配置文件redis.conf 进行修改
注释该行:#bind 127.0.0.1,表示可以让其他ip访问
将yes该为no:protected-mode no,表示可以让其他ip操作redis
2. 对爬虫进行修改
将爬虫类的父类修改成基于RedisSpider或者RedisCrawlSpider。注意:如果原始爬虫文件是基于Spider的,则应该将父类修改成RedisSpider,如果原始爬虫文件是基于CrawlSpider的,则应该将其父类修改成RedisCrawlSpider。
- 注释或者删除start_urls列表,切加入redis_key属性,属性值为scrpy-redis组件中调度器队列的名称
3. 在配置文件中进行相关配置,开启使用scrapy-redis组件中封装好的管道
- ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': }
4. 在配置文件中进行相关配置,开启使用scrapy-redis组件中封装好的调度器
- # 使用scrapy-redis组件的去重队列
- DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
- # 使用scrapy-redis组件自己的调度器
- SCHEDULER = "scrapy_redis.scheduler.Scheduler"
- # 是否允许暂停
- SCHEDULER_PERSIST = True
5.在配置文件中进行爬虫程序链接redis的配置
- REDIS_HOST = 'redis服务的ip地址'
- REDIS_PORT = 6379
- REDIS_ENCODING = ‘utf-8’
- #REDIS_PARAMS = {‘password’:’123456’} # 有密码就需要写
6 开启redis服务器:redis-server 配置文件
7开启redis客户端:redis-cli
8 运行爬虫文件:
scrapy crawl wangyi
9 向调度器队列中扔入一个起始url(在redis客户端中操作):lpush redis_key属性值 起始url
selenium、UA池、ip池、scrapy-redis的综合应用案例的更多相关文章
- UA池 代理IP池 scrapy的下载中间件
# 一些概念 - 在scrapy中如何给所有的请求对象尽可能多的设置不一样的请求载体身份标识 - UA池,process_request(request) - 在scrapy中如何给发生异常的请求设置 ...
- scrapy版本爬取某网站,加入了ua池,ip池,不限速不封号,100个线程爬崩网站
目录 scrapy版本爬取妹子图 关键所在下载图片 前期准备 代理ip池 UserAgent池 middlewares中间件(破解反爬) settings配置 正题 爬虫 保存下载图片 scrapy版 ...
- 在Scrapy中使用IP池或用户代理更新版(python3)
middlewares.py # -*- coding: utf-8 -*- # 导入随机模块 import random # 导入有关IP池有关的模块 from scrapy.downloaderm ...
- 在Scrapy中使用IP池或用户代理(python3)
一.创建Scrapy工程 scrapy startproject 工程名 二.进入工程目录,根据爬虫模板生成爬虫文件 scrapy genspider -l # 查看可用模板 scrapy gensp ...
- Python爬虫代理IP池
目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...
- java爬虫进阶 —— ip池使用,iframe嵌套,异步访问破解
写之前稍微说一下我对爬与反爬关系的理解 一.什么是爬虫 爬虫英文是splider,也就是蜘蛛的意思,web网络爬虫系统的功能是下载网页数据,进行所需数据的采集.主体也就是根据开始的超链接,下 ...
- springboot实现java代理IP池 Proxy Pool,提供可用率达到95%以上的代理IP
一.背景 前段时间,写java爬虫来爬网易云音乐的评论.不料,爬了一段时间后ip被封禁了.由此,想到了使用ip代理,但是找了很多的ip代理网站,很少有可以用的代理ip.于是,抱着边学习的心态,自己开发 ...
- 自己设计代理IP池
大体思路 使用redis作为队列,买了一份蘑菇代理,但是这个代理每5秒可以请求一次,我们将IP请求出来,从redis列表队列的左侧插入,要用的时候再从右侧取出,请求成功证明该IP是可用的,将该代理IP ...
- 封装IP池和用户代理相应的类(python3)
一.middlewares.py源代码: # -*- coding: utf-8 -*- # 导入随机模块 import random # 导入有关IP池有关的模块 from scrapy.contr ...
随机推荐
- 放弃antd table,基于React手写一个虚拟滚动的表格
缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...
- 利用Oracle Database Resource Manager实现UNDO表空间的quota
1.查出当前使用的是哪个resource plan select * from GV$RSRC_PLAN 2.创建pending area begin dbms_resource_manager.c ...
- Python之socket_udp
UDP服务端&客户端编程 ''' udp编程 创建socket对象,socket.SOCK_DGRAM 绑定ip和port,bind()方法 传输数据 1.接收数据,socket.recvfr ...
- H3C交换机配置命令(收集)
1:配置登录用户,口令等 <H3C> //用户直行模式提示符,用户视图 <H3C>system-view //进入配置视图 [ ...
- Keepalived配置文件详解
global_defs { router_id LVS_$prio #节点唯一标识,通常为hostname } local_address_group laddr_g1 { ${lvs_node} # ...
- Tensorflow object detection API ——环境搭建与测试
1.开发环境搭建 ①.安装Anaconda 建议选择 Anaconda3-5.0.1 版本,已经集成大多数库,并将其作为默认python版本(3.6.3),配置好环境变量(Anaconda安装则已经配 ...
- SSM框架下 Failed to load resource: the server responded with a status of 404 (Not Found)错误
这个错误提示的是js的引用路径有错: 1.检查应用路径是否正确(我的问题是路径是正确的但是去到页面就会提示404错误) 引用路径,最好都使用绝对路径 <script type="tex ...
- workbench使用小笔记(不定期持续更新)
1. 删除不使用的工作空间 在使用workbench时,之前可能建了好几个工作空间,现在有一些不使用了,每次打开都能还能看到它们,对于强迫症来说多少有一些不爽.如下图: 现在,就把那些不使用的工作空间 ...
- hdu5686大数斐波那契
Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多 ...
- ELK学习笔记之logstash安装logstash-filter-multiline(在线离线安装)
0x00 概述 ELK-logstash在搬运日志的时候会出现多行日志,普通的搬运会造成保存到ES中单条单条,很丑,而且不方便读取,logstash-filter-multiline可以解决该问题 g ...