在目录下创建tools(python package) 在tools中创建crawl_xici_ip.py文件写入代码如下:

  1. #coding=utf-8
  2. import requests
  3. from scrapy.selector import Selector
  4. import pymysql
  5.  
  6. conn = pymysql.connect(host="127.0.0.1", user="username", passwd="userpassword", db="proxy_ip", charset="utf8")
  7. cursor = conn.cursor()
  8.  
  9. def crawl_ips():
  10. #爬取西刺的免费ip代理
  11. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"}
  12. for i in range(1568):
  13. re = requests.get("http://www.xicidaili.com/nn/{0}".format(i), headers=headers)
  14.  
  15. selector = Selector(text=re.text)
  16. all_trs = selector.css("#ip_list tr")
  17.  
  18. ip_list = []
  19. for tr in all_trs[1:]:
  20. speed_str = tr.css(".bar::attr(title)").extract()[0]
  21. if speed_str:
  22. speed = float(speed_str.split("秒")[0])
  23. all_texts = tr.css("td::text").extract()
  24.  
  25. ip = all_texts[0]
  26. port = all_texts[1]
  27. proxy_type = all_texts[5]
  28.  
  29. ip_list.append((ip, port, proxy_type, speed))
  30.  
  31. for ip_info in ip_list:
  32. cursor.execute(
  33. "insert proxy(ip, port, speed, proxy_type) VALUES('{0}', '{1}', {2}, 'HTTP')".format(
  34. ip_info[0], ip_info[1], ip_info[3]
  35. )
  36. )
  37.  
  38. conn.commit()
  39.  
  40. class GetIP(object):
  41. def delete_ip(self, ip):
  42. #从数据库中删除无效的ip
  43. delete_sql = """
  44. delete from proxy where ip='{0}'
  45. """.format(ip)
  46. cursor.execute(delete_sql)
  47. conn.commit()
  48. return True
  49.  
  50. def judge_ip(self, ip, port):
  51. #判断ip是否可用
  52. http_url = "http://www.baidu.com"
  53. proxy_url = "http://{0}:{1}".format(ip, port)
  54. try:
  55. proxy_dict = {
  56. "http":proxy_url,
  57. }
  58. response = requests.get(http_url, proxies=proxy_dict)
  59. except Exception as e:
  60. print ("invalid ip and port")
  61. self.delete_ip(ip)
  62. return False
  63. else:
  64. code = response.status_code
  65. if code >= 200 and code < 300:
  66. print ("effective ip")
  67. return True
  68. else:
  69. print ("invalid ip and port")
  70. self.delete_ip(ip)
  71. return False
  72.  
  73. def get_random_ip(self):
  74. #从数据库中随机获取一个可用的ip
  75. random_sql = """
  76. SELECT ip, port FROM proxy
  77. ORDER BY RAND()
  78. LIMIT 1
  79. """
  80. result = cursor.execute(random_sql)
  81. for ip_info in cursor.fetchall():
  82. ip = ip_info[0]
  83. port = ip_info[1]
  84.  
  85. judge_re = self.judge_ip(ip, port)
  86. if judge_re:
  87. return "http://{0}:{1}".format(ip, port)
  88. else:
  89. return self.get_random_ip()
  90.  
  91. print (crawl_ips())
  92. if __name__ == "__main__":
  93. get_ip = GetIP()
  94. get_ip.get_random_ip()

在middlewares.py中添加代码如下:

  1. from tools.crawl_xici_ip import GetIP
  2.  
  3. class RandomProxyMiddleware(object):
  4. #动态设置ip代理
  5. def process_request(self, request, spider):
  6. get_ip = GetIP()
  7. request.meta["proxy"] = get_ip.get_random_ip()

在settings.py中配置

scrapy实战9动态设置ip代理从数据库中随机获取一个可用的ip:的更多相关文章

  1. 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中<meta-data>变量的值

    转载请说明来源: http://www.cnblogs.com/lizhilin2016/p/7390079.html 最近lz 在开始做一个新的Demo, 在项目中集成了bugly用于收集项目中的崩 ...

  2. 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中&lt;meta-data&gt;变量的值

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客 你也能够查看我的其它同类文章.也会让你有一定的 ...

  3. DataGridView设置不自动显示数据库中未绑定的列

    项目中将从数据库查出来的数据绑定到DataGridView,但是不想显示所有的字段.此功能可以通过sql语句控制查出来的字段数目,但是DataGridView有属性可以控制不显示未绑定的数据,从UI层 ...

  4. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递 ...

  5. 数据库:MySQL实战;左链接;查询WordPress数据库中的文章内容

    在1年前,我用学生价租了一个阿里云服务器(是真的便宜啊),自己在CentOS系统上用命令行搭了个WordPress的环境,开始了为期一个月使用自建博客的历程. 事实证明,博客在类似博客园这样的平台上写 ...

  6. scrapy 自定义图片路径保存,并存到数据库中

    scrapy中有个自带的pipeline工具,ImagesPipeline,可以专门用来储存图片到本地. 但默认储存地址无法配置,所以我们需要写一个自己的pipeline用于储存图片. 先分析一下我们 ...

  7. 如果有反向代理的情况下,获取最原始的IP的办法

    HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_HOST"];

  8. 动态调用WebService 通用方法Moss 中 传统开发中都可用。

    WebService是啥大家都知道了,这里不做过多的解释.通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会 ...

  9. IOS中如何获取手机的当前IP

    网上有许多类似的帖子.在搜索了资料以后.觉得下面的方法是最简单的. 使用的时候直接把类方法拖到自己新建的分类中就行. .h文件 #import <Foundation/Foundation.h& ...

随机推荐

  1. 生成EF后修改最大长度限制等

      右键属性    

  2. WPF中任意Object的XAML代码格式化输出

    原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...

  3. wpf.xaml.behavior

    Install-Package Microsoft.Xaml.Behaviors.Wpf Remove reference to “Microsoft.Expression.Interactions” ...

  4. liunx 常用操作命令

    1.复制粘贴命令:在一行的任何位置按下yy,y是yanked拷贝的意思,然后去想粘贴的位置按下p即可.p是粘贴的意思. 2.如果想复制3行的话,按下3yy,就复制3行,如果想复制多行的话,直接按数字可 ...

  5. QML中文件的加载(三种方法)

    在这里小小总结一下QML文件中如何加载QML文件与JavaScript文件. 1.QML文件中加载JavaScript文件 语法: import <ModuleIdentifier> &l ...

  6. Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果

    原文:Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果  [函数名称] RGB分量调整         RGBAdjustProcess(WriteableBitmap  ...

  7. C#数字图像处理时注意图像的未用区域

    原文:C#数字图像处理时注意图像的未用区域 图1. 被锁定图像像素数组基本布局         如图1所示,数组的宽度并不一定等于图像像素数组的宽度,还有一部分未用区域.这是为了提高效率,系统要确定每 ...

  8. Android零基础入门第54节:视图切换组件ViewSwitcher

    原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...

  9. 我怎么忽略了身份框架魔法,只是使用OWIN验证的中间件,以获得要求我寻求什么呢?

    该OWIN中间件的东西第三方登录集成到您的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何就剜出来的新的ID,它取代了蹩脚的成员身份 API.我没有兴趣在坚持所产生的债权,并在英法为基础的数据 ...

  10. 一次C#和C++的实际应用性能比较(C++允许我们使用任何手段来提高效率,只要愿意做出足够的努力)

    05年时,在微软的Rico Mariani做了一次实际应用的C#和C++的性能比较.事情起源于微软著名的元老Raymond Chen(在下敬仰的超级牛人)用C++写了一个英汉词典程序,来描述讲解优化C ...