在爬虫爬取过程中,网站会根据我们的IP和UA去确认到底是浏览器操作还是爬虫在操作,所以,为了让爬虫不被网站禁止,随机切换Ip 和UA是很重要的,因为这个类在各个爬虫中经常要用到,所以可以自已维护一份随机切换IP和UA的代码,
可以在爬虫工程目录中加入tools这个目录,这个目录中存放着这个爬虫所用到的一些工具,
目录结构如下:
get_ip.py 代码如下:
import requests
import pymysql class GetIp(object):
"""从数据库中取出可用的IP给爬虫使用"""
conn = pymysql.connect(host="127.0.0.1", user="root", password="root", db="outback")
cursor = conn.cursor() def get_random_ip(self):
select_sql = "select ip,port,type from ip_proxy ORDER by rand() limit 1" result = self.cursor.execute(select_sql)
for ip_info in self.cursor.fetchall():
ip = ip_info[0]
port = ip_info[1]
type = ip_info[2].lower()
judge_result = self.judge_ip(type, ip, port, )
if judge_result:
# 这里不能关闭连接,因为每一个请求都会云获取一个IP,如果关了,就只能获取一个
# self.cursor.close()
# self.conn.close() return "{0}://{1}:{2}".format(type, ip, port)
else:
self.get_random_ip() def judge_ip(self, type, ip, port):
"""验证IP是否可用,如果可以用,则返回,不可用,则删除数据库中的该IP"""
baidu = "https://www.baidu.com"
proxy_url = "{0}://{1}:{2}".format(type, ip, port)
try:
proxy_dict = {type:proxy_url,}
response = requests.get(baidu, proxies=proxy_dict)
except Exception as e:
print("invalid in or port ")
self.delete_ip(ip)
return False
else:
code = response.status_code
if code >= 200 and code < 300:
print("effective ip,the ip is",proxy_url)
return True
else:
print("invalid iP ")
self.delete_ip(ip)
return False def delete_ip(self, ip):
delete_sql = """delete FROM ip_proxy where ip='{0}'""".format(ip)
try:
self.cursor.execute(delete_sql)
self.conn.commit()
except Exception as e:
print(e) if __name__ == "__main__":
get_ip = GetIp()
ip = get_ip.get_random_ip()
print(ip)
之后在middlewares.py 中进行设置,
middlewares.py代码如下:
from taobao.tools.get_ip import GetIp class RandomProxyMiddleware(object):
#动态设置ip代理
def process_request(self, request, spider):
get_ip = GetIP()
request.meta["proxy"] = get_ip.get_random_ip()
这样就可以使scrapy 动态的随机更换IP
二 随机更换UA,
自己可以在settings中维护一个ua池,然后随机切换,但是这样有个不好的地方是,自已维护UA池很麻烦,还在定期查看这些UA是否可用,网上有个开源的库 fake-useragent
这个库动态的管理着很多UA,可以使用。
用法如下:
from scrapy import signals
from fake_useragent import UserAgent class RandomUserAgentMiddleware(object):
"""使用爬虫使用随机的Ip 和 UA""" def __init__(self, crawler):
self.ua = UserAgent()
self.ua_type = crawler.settings.get("USER_AGENT_TYPE", "random")
super(RandomIpAndUserAgentMiddleware, self).__init__() @classmethod
def from_crawler(cls, crawler):
return cls(crawler) def process_request(self, request, spider):
def get_ua():
return getattr(self.ua, self.ua_type) request.headers.setdefault('User-Agent', get_ua())
其实上边两个类可写成一个类,这个在settings中只设置一个类就行了,代码如下:
from scrapy import signals
from fake_useragent import UserAgent
from taobao.tools.get_ip import GetIp def process_request(self, request, spider):
def get_ua():
return getattr(self.ua, self.ua_type)
request.headers.setdefault('User-Agent', get_ua())
get_ip = GetIP()
request.meta["proxy"] = get_ip.get_random_ip()
上面代码中有几个非常重要的,也是很容易出错的地了,
一、老师,前辈们经常会说,文件打开记得关闭,数据库连接后记得断开连接,但是在GetIp这个类中不能断开数据库(我在这里也卡了),因为scrapy是随机取IP,也就意味着scrapy对每次请求(也可能是每几次请求)就会去数据库中取IP,所以如果在GetIp这个类中就断开连接后,也就是只能取一次,下次就不能取了,所以GetIp这个类中不能断开连接,可以使用scrapy 信号,当爬虫关闭的时候断开连接。所以GetIp类不连接数据而没有断开连接是没有错的。
二,西刺的IP很慢,所以还是珍惜自已的IP,友好爬取,
GitHubhttps://github.com/573320328/tools
随机切换IP和UA的更多相关文章
-
PHP利用socket_bind函数切换IP地址采集数据
在利用PHP进行数据采集的过程中,通常会遇到IP被屏蔽或出现验证码的情况:为了能够继续采集,我们需要切换不同的ip,每访问一次,随机切换一个IP.当然也可以通过收集大量代理,通过切换代理的方式进行采集 ...
-
Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换
总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...
-
公有云厂商DDoS防护产品竞品分析——内含CC的一些简单分析,貌似多是基于规则,CC策略细粒度ip/url//ua/refer
公有云厂商DDoS防护产品竞品分析 from:http://www.freebuf.com/articles/network/132239.html 行文初衷 由于工作关系,最近接触了很多云上用户,对 ...
-
scrapy的中间件Downloader Middleware实现User-Agent随机切换
scrapy的中间件Download Middleware实现User-Agent随机切换 总架构理解Middleware 通过scrapy官网最新的架构图来理解: 从图中我们可以看出,在spid ...
-
Python之爬虫(二十五) Scrapy的中间件Downloader Middleware实现User-Agent随机切换
总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...
-
window自动切换ip的脚本
因为总要切换ip,所以百度了一下脚本 如下http://jingyan.baidu.com/article/d2b1d1029d21b95c7e37d4fa.html 动态ip netsh inter ...
-
php 随机生成ip
#随机生成IP 中国区 function randip(){ $ip_1 = -1; $ip_2 = -1; $ip_3 = rand(0,255); $ip_4 = rand(0,255); $ip ...
-
巧用批处理cmd快速切换IP地址
如果你的笔记本经常在不同的地方使用,有些地方需要自动获取IP,而有些地方需要配置固定IP,每换一个地方都需要重新配置一遍,是不是感觉很麻烦呢? 下面介绍一种通过建立批处理文件来快速切换IP的方法: s ...
-
Windows环境下使用Netsh命令快速切换IP配置
不同的内网环境需要使用不同的IP配置,频繁切换令人发狂,因此搜索了快速切换IP配置的方法. Netsh interface IP Set address "以太网" Static ...
随机推荐
-
Highcharts结合PhantomJS在服务端生成高质量的图表图片
项目背景 最近忙着给部门开发一套交互式的报表系统,来替换原有的静态报表系统. 老系统是基于dotnetCHARTING开发的,dotnetCHARTING的优势是图表类型丰富,接口调用简单,使用时只需 ...
-
VS中遇到的奇怪问题
8.错误 C2440: “static_cast”: 无法从“void (__thiscall CView::* )(UINT,LONG)”转换为“LRESULT (__thiscall CWnd:: ...
-
printf 缓冲区问题
突然发现printf的问题,看了这个很有意思,学习一下 转自:http://blog.csdn.net/shanshanpt/article/details/7385649 昨天在做Linux实验的时 ...
-
[BZOJ 3172] [Tjoi2013] 单词 【AC自动机】
题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性 ...
-
C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小
上一篇我们说到大文件的分片下载.断点续传.秒传,有的博友就想看分片下载,我们也来总结一下下载的几种方式,写的比较片面,大家见谅^_^. 下载方式: 1.html超链接下载: 2.后台下载(四种方法:返 ...
-
win10设置操作备忘
添加密码, 更改密码: Win键-->左侧用户图标-->更改帐户设置-->登陆选项-->添加密码 | 更改密码
-
自定义适用于手机和平板电脑的 Dynamics 365(一):主页
当用户首次打开适用于手机和平板电脑的 Dynamics 365 时,他们将看到默认为“销售仪表板”的主页. 您可以创建新仪表板或 Web 应用程序中编辑现有仪表板,然后为移动设备启用它们,用户可以选择 ...
-
Linux-/etc/rc.local 或 service 中使用 sudo -u xxx cmd 执行失败(sorry, you must have a tty to run sudo)解决办法
使用 visudo 命令编辑 /etc/sudoers 1)Defaults requiretty,修改为 #Defaults requiretty,表示不需要控制终端. 2)Defaults req ...
-
Spring-事务管理(Transaction)
1.事务介绍 事务(Transaction):访问并能更新数据库中数据项的一个程序执行单元. 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须要么全部完成,要么什么都不做,如果有 ...
-
使用idea创建JavaWeb项目
[第一步] File---New---Project [第二步] 选择Java Enterprise版本,然后配置tomcat 注意:这里关联的tomcat home指的是tomcat的解压目录(bi ...