scrapy实战9动态设置ip代理从数据库中随机获取一个可用的ip:
在目录下创建tools(python package) 在tools中创建crawl_xici_ip.py文件写入代码如下:
- #coding=utf-8
- import requests
- from scrapy.selector import Selector
- import pymysql
- conn = pymysql.connect(host="127.0.0.1", user="username", passwd="userpassword", db="proxy_ip", charset="utf8")
- cursor = conn.cursor()
- def crawl_ips():
- #爬取西刺的免费ip代理
- headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"}
- for i in range(1568):
- re = requests.get("http://www.xicidaili.com/nn/{0}".format(i), headers=headers)
- selector = Selector(text=re.text)
- all_trs = selector.css("#ip_list tr")
- ip_list = []
- for tr in all_trs[1:]:
- speed_str = tr.css(".bar::attr(title)").extract()[0]
- if speed_str:
- speed = float(speed_str.split("秒")[0])
- all_texts = tr.css("td::text").extract()
- ip = all_texts[0]
- port = all_texts[1]
- proxy_type = all_texts[5]
- ip_list.append((ip, port, proxy_type, speed))
- for ip_info in ip_list:
- cursor.execute(
- "insert proxy(ip, port, speed, proxy_type) VALUES('{0}', '{1}', {2}, 'HTTP')".format(
- ip_info[0], ip_info[1], ip_info[3]
- )
- )
- conn.commit()
- class GetIP(object):
- def delete_ip(self, ip):
- #从数据库中删除无效的ip
- delete_sql = """
- delete from proxy where ip='{0}'
- """.format(ip)
- cursor.execute(delete_sql)
- conn.commit()
- return True
- def judge_ip(self, ip, port):
- #判断ip是否可用
- http_url = "http://www.baidu.com"
- proxy_url = "http://{0}:{1}".format(ip, port)
- try:
- proxy_dict = {
- "http":proxy_url,
- }
- response = requests.get(http_url, proxies=proxy_dict)
- except Exception as e:
- print ("invalid ip and port")
- self.delete_ip(ip)
- return False
- else:
- code = response.status_code
- if code >= 200 and code < 300:
- print ("effective ip")
- return True
- else:
- print ("invalid ip and port")
- self.delete_ip(ip)
- return False
- def get_random_ip(self):
- #从数据库中随机获取一个可用的ip
- random_sql = """
- SELECT ip, port FROM proxy
- ORDER BY RAND()
- LIMIT 1
- """
- result = cursor.execute(random_sql)
- for ip_info in cursor.fetchall():
- ip = ip_info[0]
- port = ip_info[1]
- judge_re = self.judge_ip(ip, port)
- if judge_re:
- return "http://{0}:{1}".format(ip, port)
- else:
- return self.get_random_ip()
- print (crawl_ips())
- if __name__ == "__main__":
- get_ip = GetIP()
- get_ip.get_random_ip()
在middlewares.py中添加代码如下:
- from tools.crawl_xici_ip import GetIP
- class RandomProxyMiddleware(object):
- #动态设置ip代理
- def process_request(self, request, spider):
- get_ip = GetIP()
- request.meta["proxy"] = get_ip.get_random_ip()
在settings.py中配置
scrapy实战9动态设置ip代理从数据库中随机获取一个可用的ip:的更多相关文章
- 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中<meta-data>变量的值
转载请说明来源: http://www.cnblogs.com/lizhilin2016/p/7390079.html 最近lz 在开始做一个新的Demo, 在项目中集成了bugly用于收集项目中的崩 ...
- 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中<meta-data>变量的值
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客 你也能够查看我的其它同类文章.也会让你有一定的 ...
- DataGridView设置不自动显示数据库中未绑定的列
项目中将从数据库查出来的数据绑定到DataGridView,但是不想显示所有的字段.此功能可以通过sql语句控制查出来的字段数目,但是DataGridView有属性可以控制不显示未绑定的数据,从UI层 ...
- Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递 ...
- 数据库:MySQL实战;左链接;查询WordPress数据库中的文章内容
在1年前,我用学生价租了一个阿里云服务器(是真的便宜啊),自己在CentOS系统上用命令行搭了个WordPress的环境,开始了为期一个月使用自建博客的历程. 事实证明,博客在类似博客园这样的平台上写 ...
- scrapy 自定义图片路径保存,并存到数据库中
scrapy中有个自带的pipeline工具,ImagesPipeline,可以专门用来储存图片到本地. 但默认储存地址无法配置,所以我们需要写一个自己的pipeline用于储存图片. 先分析一下我们 ...
- 如果有反向代理的情况下,获取最原始的IP的办法
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_HOST"];
- 动态调用WebService 通用方法Moss 中 传统开发中都可用。
WebService是啥大家都知道了,这里不做过多的解释.通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会 ...
- IOS中如何获取手机的当前IP
网上有许多类似的帖子.在搜索了资料以后.觉得下面的方法是最简单的. 使用的时候直接把类方法拖到自己新建的分类中就行. .h文件 #import <Foundation/Foundation.h& ...
随机推荐
- 生成EF后修改最大长度限制等
右键属性
- WPF中任意Object的XAML代码格式化输出
原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...
- wpf.xaml.behavior
Install-Package Microsoft.Xaml.Behaviors.Wpf Remove reference to “Microsoft.Expression.Interactions” ...
- liunx 常用操作命令
1.复制粘贴命令:在一行的任何位置按下yy,y是yanked拷贝的意思,然后去想粘贴的位置按下p即可.p是粘贴的意思. 2.如果想复制3行的话,按下3yy,就复制3行,如果想复制多行的话,直接按数字可 ...
- QML中文件的加载(三种方法)
在这里小小总结一下QML文件中如何加载QML文件与JavaScript文件. 1.QML文件中加载JavaScript文件 语法: import <ModuleIdentifier> &l ...
- Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果
原文:Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果 [函数名称] RGB分量调整 RGBAdjustProcess(WriteableBitmap ...
- C#数字图像处理时注意图像的未用区域
原文:C#数字图像处理时注意图像的未用区域 图1. 被锁定图像像素数组基本布局 如图1所示,数组的宽度并不一定等于图像像素数组的宽度,还有一部分未用区域.这是为了提高效率,系统要确定每 ...
- Android零基础入门第54节:视图切换组件ViewSwitcher
原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...
- 我怎么忽略了身份框架魔法,只是使用OWIN验证的中间件,以获得要求我寻求什么呢?
该OWIN中间件的东西第三方登录集成到您的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何就剜出来的新的ID,它取代了蹩脚的成员身份 API.我没有兴趣在坚持所产生的债权,并在英法为基础的数据 ...
- 一次C#和C++的实际应用性能比较(C++允许我们使用任何手段来提高效率,只要愿意做出足够的努力)
05年时,在微软的Rico Mariani做了一次实际应用的C#和C++的性能比较.事情起源于微软著名的元老Raymond Chen(在下敬仰的超级牛人)用C++写了一个英汉词典程序,来描述讲解优化C ...