用Python爬虫抓取免费代理IP

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

不知道大家有没有遇到过“访问频率太高”这样的网站提示,我们需要等待一段时间或者输入一个验证码才能解封,但这样的情况之后还是会出现。出现这个现象的原因就是我们所要爬取的网页采取了反爬虫的措施,比如当某个ip单位时间请求网页次数过多时,服务器会拒绝服务,这种情况就是由于访问频率引起的封ip,这种情况靠解封不能很好的解决,所以我们就想到了伪装本机ip去请求网页,也就是我们今天要讲的使用代理ip。

目前网上有许多代理ip,有免费的也有付费的,例如西刺代理等,免费的虽然不用花钱但有效的代理很少且不稳定,付费的可能会好一点,不过今天我只爬取免费的代理并将检测是否可用,将可用ip存入MongoDB,方便下次取出。

运行平台:Windows

Python版本:Python3.6

IDE: Sublime Text

其他:Chrome浏览器

简述流程为:

步骤1:了解requests代理如何使用

步骤2:从代理网页爬取到ip和端口

步骤3:检测爬取到的ip是否可用

步骤4:将爬取的可用代理存入MongoDB

步骤5:从存入可用ip的数据库里随机抽取一个ip,测试成功后返回

对于requests来说,代理的设置比较简单,只需要传入proxies参数即可。

不过需要注意的是,这里我是在本机安装了抓包工具Fiddler,并用它在本地端口8888创建了一个HTTP代理服务(用Chrome插件SwitchyOmega),即代理服务为:127.0.0.1:8888,我们只要设置好这个代理,就可以成功将本机ip切换成代理软件连接的服务器ip了。


 
 
  1. import requests

  2. proxy = '127.0.0.1:8888'

  3. proxies = {

  4. 'http':'http://' + proxy,

  5. 'https':'http://' + proxy

  6. }

  7. try:

  8. response = requests.get('http://httpbin.org/get',proxies=proxies)

  9. print(response.text)

  10. except requests.exceptions.ConnectionError as e:

  11. print('Error',e.args)

这里我是用来http://httpbin.org/get作为测试网站,我们访问该网页可以得到请求的有关信息,其中origin字段就是客户端ip,我们可以根据返回的结果判断代理是否成功。返回结果如下:


 
 
  1. {

  2. "args":{},

  3. "headers":{

  4. "Accept":"*/*",

  5. "Accept-Encoding":"gzip, deflate",

  6. "Connection":"close",

  7. "Host":"httpbin.org",

  8. "User-Agent":"python-requests/2.18.4"

  9. },

  10. "origin":"xx.xxx.xxx.xxx",

  11. "url":"http://httpbin.org/get"

  12. }

接下来我们便开始爬取代理IP,首先我们打开Chrome浏览器查看网页,并找到ip和端口元素的信息。

可以看到,代理IP以表格存储ip地址及其相关信息,所以我们用BeautifulSoup提取时很方便便能提取出相关信息,但是我们需要注意的是,爬取的ip很有可能出现重复的现象,尤其是我们同时爬取多个代理网页又存储到同一数组中时,所以我们可以使用集合来去除重复的ip。

将要爬取页数的ip爬取好后存入数组,然后再对其中的ip逐一测试。

这里就用到了上面提到的requests设置代理的方法,我们使用http://httpbin.org/ip作为测试网站,它可以直接返回我们的ip地址,测试通过后再存入MomgoDB数据库。

连接数据库然后指定数据库和集合,再将数据插入就OK了。

最后运行查看一下结果吧

运行了一段时间后,难得看到一连三个测试通过,赶紧截图保存一下,事实上是,毕竟是免费代理,有效的还是很少的,并且存活时间确实很短,不过,爬取的量大,还是能找到可用的,我们只是用作练习的话,还是勉强够用的。现在看看数据库里存储的吧。

因为爬取的页数不多,加上有效ip也少,再加上我没怎么爬,所以现在数据库里的ip并不多,不过也算是将这些ip给存了下来。现在就来看看怎么随机取出来吧。

由于担心放入数据库一段时间后ip会失效,所以取出前我重新进行了一次测试,如果成功再返回ip,不成功的话就直接将其移出数据库。

这样我们需要使用代理的时候,就能通过数据库随时取出来了。

总的代码如下:


 
 
  1. import random

  2. import requests

  3. import time

  4. import pymongo

  5. from bs4 import BeautifulSoup

  6. # 爬取代理的URL地址,选择的是西刺代理

  7. url_ip = "http://www.xicidaili.com/nt/"

  8. # 设定等待时间

  9. set_timeout = 5

  10. # 爬取代理的页数,2表示爬取2页的ip地址

  11. num = 2

  12. # 代理的使用次数

  13. count_time = 5

  14. # 构造headers

  15. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}

  16. # 测试ip的URL

  17. url_for_test = 'http://httpbin.org/ip'

  18. def scrawl_xici_ip(num):

  19. '''

  20. 爬取代理ip地址

  21. '''

  22. ip_list = []

  23. for num_page in range(1,num):

  24. url = url_ip + str(num_page)

  25. response = requests.get(url,headers=headers)

  26. if response.status_code == 200:

  27. content = response.text

  28. soup = BeautifulSoup(content,'lxml')

  29. trs = soup.find_all('tr')

  30. for i in range(1,len(trs)):

  31. tr = trs[i]

  32. tds = tr.find_all('td')

  33. ip_item = tds[1].text + ':' + tds[2].text

  34. # print(ip_item)

  35. ip_list.append(ip_item)

  36. ip_set = set(ip_list) # 去掉可能重复的ip

  37. ip_list = list(ip_set)

  38. time.sleep(count_time) # 等待5秒

  39. return ip_list

  40. def ip_test(url_for_test,ip_info):

  41. '''

  42. 测试爬取到的ip,测试成功则存入MongoDB

  43. '''

  44. for ip_for_test in ip_info:

  45. # 设置代理

  46. proxies = {

  47. 'http': 'http://' + ip_for_test,

  48. 'https': 'http://' + ip_for_test,

  49. }

  50. print(proxies)

  51. try:

  52. response = requests.get(url_for_test,headers=headers,proxies=proxies,timeout=10)

  53. if response.status_code == 200:

  54. ip = {'ip':ip_for_test}

  55. print(response.text)

  56. print('测试通过')

  57. write_to_MongoDB(ip)

  58. except Exception as e:

  59. print(e)

  60. continue

  61. def write_to_MongoDB(proxies):

  62. '''

  63. 将测试通过的ip存入MongoDB

  64. '''

  65. client = pymongo.MongoClient(host='localhost',port=27017)

  66. db = client.PROXY

  67. collection = db.proxies

  68. result = collection.insert(proxies)

  69. print(result)

  70. print('存储MongoDB成功')

  71. def get_random_ip():

  72. '''

  73. 随机取出一个ip

  74. '''

  75. client = pymongo.MongoClient(host='localhost',port=27017)

  76. db = client.PROXY

  77. collection = db.proxies

  78. items = collection.find()

  79. length = items.count()

  80. ind = random.randint(0,length-1)

  81. useful_proxy = items[ind]['ip'].replace('\n','')

  82. proxy = {

  83. 'http': 'http://' + useful_proxy,

  84. 'https': 'http://' + useful_proxy,

  85. }

  86. response = requests.get(url_for_test,headers=headers,proxies=proxy,timeout=10)

  87. if response.status_code == 200:

  88. return useful_proxy

  89. else:

  90. print('此{ip}已失效'.format(useful_proxy))

  91. collection.remove(useful_proxy)

  92. print('已经从MongoDB移除')

  93. get_random_ip()

  94. def main():

  95. ip_info = []

  96. ip_info = scrawl_xici_ip(2)

  97. sucess_proxy = ip_test(url_for_test,ip_info)

  98. finally_ip = get_random_ip()

  99. print('取出的ip为:' + finally_ip)

  100. if __name__ == '__main__':

  101. main()



原文发布时间为:2018-06-27
本文作者:HDMI
本文来自云栖社区合作伙伴“ Python中文社区”,了解相关信息可以关注“ Python中文社区”。
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
20天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
4天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
10天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
17天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
21天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
24天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
22天前
|
数据采集 JavaScript 前端开发
Python爬虫能处理动态加载的内容吗?
Python爬虫可处理动态加载内容,主要方法包括:使用Selenium模拟浏览器行为;分析网络请求,直接请求API获取数据;利用Pyppeteer控制无头Chrome。这些方法各有优势,适用于不同场景。
|
1月前
|
数据采集 监控 搜索推荐
python爬虫的基本使用
本文介绍了Python爬虫的基本概念及其广泛应用,包括搜索引擎、数据挖掘、网络监控、舆情分析和信息聚合等领域。通过安装`urllib`和`BeautifulSoup`库,展示了如何编写简单代码实现网页数据的抓取与解析。爬虫技术在大数据时代的重要性日益凸显,为各行业提供了高效的数据获取手段。
34 1
|
1月前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
24天前
|
数据采集 API 定位技术
Python技术进阶:动态代理IP的跨境电商解决方案
Python技术进阶:动态代理IP的跨境电商解决方案
下一篇
DataWorks