scrapy爬虫代理——利用crawlera神器,无需再寻找代理IP
在使用爬虫爬取网络数据时,如果长时间对一个网站进行抓取时可能会遇到IP被封的情况,这种情况可以使用代理更换ip来突破服务器封IP的限制。
随手在百度上搜索免费代理IP,可以得到一系列的网站,这里我们通过对西刺网站的抓取来举例。
验证代理IP是否可用,原理是使用代理IP访问指定网站,如果返回状态为200,表示这个代理是可以使用的。
http://www.jianshu.com/p/588241a313e7
方法1:
import requests try: requests.get('http://wenshu.court.gov.cn/', proxies={"http":"http://121.31.154.12:8123"}) except: print 'connect failed' else: print 'success'
方法2:
import telnetlib try: telnetlib.Telnet('127.0.0.1', port='80', timeout=20) except: print 'connect failed' else: print 'success'
例子:
#coding=UTF-8 import urllib.request def validateIp(): inFile = open('proxy.txt', 'r') f = open("proxy2.txt","w") url = "http://www.baidu.com/" for line in inFile.readlines(): try: #print(line) line = line.strip('\n') proxy_host = '://'.join(line.split('=')) #print(proxy_host) proxy_temp = {line.split("=")[0]:proxy_host} print(proxy_temp) urllib.request.urlopen(url,proxies=proxy_temp).read() f.write(line+'\n') except Exception as e: print('%s connect failed' % line) continue f.close() if __name__ == '__main__': validateIp()
结果:
{'http': 'http://218.21.169.19:8998'}
http=218.21.169.19:8998 connect failed
{'http': 'http://27.46.74.38:9999'}
http=27.46.74.38:9999 connect failed
{'http': 'http://60.173.35.99:808'}
http=60.173.35.99:808 connect failed
{'http': 'http://218.4.95.182:80'}
http=218.4.95.182:80 connect failed
{'http': 'http://218.56.132.155:8080'}
http=218.56.132.155:8080 connect failed
。。
网上例子:
#coding:utf-8 import urllib2 def url_user_agent(url): #设置使用代理 proxy = {'http':'27.24.158.155:84'} proxy_support = urllib2.ProxyHandler(proxy) # opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler(debuglevel=1)) opener = urllib2.build_opener(proxy_support) urllib2.install_opener(opener) #添加头信息,模仿浏览器抓取网页,对付返回403禁止访问的问题 # i_headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} i_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48'} req = urllib2.Request(url,headers=i_headers) html = urllib2.urlopen(req) if url == html.geturl(): doc = html.read() return doc return url = 'http://www.dianping.com/search/category/2/10/g311' doc = url_user_agent(url) print doc
自己写的可用例子:
#coding=UTF-8 import urllib.request import chardet def url_user_agent(): #url = 'http://quote.stockstar.com/stock' url = 'http://www.baidu.com/' inFile = open('proxy.txt', 'r') f = open("available.txt","wb") for line in inFile.readlines(): #f.write(line+'\n') #print(line) line = line.strip('\n') #proxy_host = '://'.join(line.split('=')) proxy_host = line.split('=')[1] #print(proxy_host) proxy_temp = {line.split("=")[0]:proxy_host} print(proxy_temp) #proxy_temp = {'http':'58.33.37.205:8118'} #设置使用代理 #proxy_temp = {'http':'119.5.0.100:808'} proxy_support = urllib.request.ProxyHandler(proxy_temp) # opener = urllib.request.build_opener(proxy_support,urllib.request.HTTPHandler(debuglevel=1)) opener = urllib.request.build_opener(proxy_support) #i_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48'} #req = urllib.request.Request(url,headers=i_headers) opener.addheaders=[("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64)")] urllib.request.install_opener(opener) #添加头信息,模仿浏览器抓取网页,对付返回403禁止访问的问题 # i_headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} try: html = urllib.request.urlopen(url,timeout=5) content = html.read() print(content) #print(type(content)) #print(chardet.detect(content)) print("==============================") if content.strip() != '': line = line + '\n' data = line.encode(encoding="UTF-8") f.write(data) except Exception as e: print('%s connect failed' % line) f.close() print("Test End !") if __name__ == '__main__': url_user_agent()
多线程例子:
#coding=UTF-8 import urllib.request import urllib import re import time import socket import threading #整理代理IP格式 proxys = [] inFile = open('proxy.txt','r') proxy_ip=open('proxy_ip.txt','w') #新建一个储存有效IP的文档 for line in inFile.readlines(): line = line.strip('\n') #proxy_host = '://'.join(line.split('=')) proxy_host = line.split('=')[1] #print(proxy_host) proxy_temp = {line.split("=")[0]:proxy_host} print(proxy_temp) proxys.append(proxy_temp) lock=threading.Lock() #建立一个锁 #验证代理IP有效性的方法 def test(i): socket.setdefaulttimeout(5) #设置全局超时时间 #url = "http://quote.stockstar.com/stock" #打算爬取的网址 url = "http://www.baidu.com/" #打算爬取的网址 try: proxy_support = urllib.request.ProxyHandler(proxys[i]) opener = urllib.request.build_opener(proxy_support) opener.addheaders=[("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64)")] urllib.request.install_opener(opener) res = urllib.request.urlopen(url).read() # 获取锁,用于线程同步 lock.acquire() #获得锁 print(proxys[i],'is OK') proxy_ip.write('%s\n' %str(proxys[i])) #写入该代理IP # 释放锁,开启下一个线程 lock.release() #释放锁 except Exception as e: lock.acquire() print(proxys[i],e) lock.release() #单线程验证 '''for i in range(len(proxys)): test(i)''' #多线程验证 threads=[] start = time.clock() for i in range(len(proxys)): thread=threading.Thread(target=test,args=[i]) threads.append(thread) thread.start() #阻塞主进程,等待所有子线程结束 for thread in threads: thread.join() proxy_ip.close() #关闭文件 end = time.clock() print("开始时间: %f s" % start) print("结束时间: %f s" % end) print("校验IP耗时: %f s" % (end - start))
结果:
...
{'http': '221.197.1.210:14515'} <urlopen error timed out>
{'http': '183.78.183.156:82'} is OK
开始时间: 0.000000 s
结束时间: 6.352310 s
校验IP耗时: 6.352309 s
#coding:gbk import requests '''代理IP地址(高匿)''' proxy = { 'http': 'http://117.85.105.170:808', 'https': 'https://117.85.105.170:808' } '''head 信息''' head = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Connection': 'keep-alive'} '''http://icanhazip.com会返回当前的IP地址''' p = requests.get('http://icanhazip.com', headers=head, proxies=proxy) print(p.text)
相关推荐
验证代理IP是否可用。原理是使用代理IP访问指定网站,如果返回状态为200,表示这个代理是可以使用的。 # _*_ coding:utf-8 _*_ import urllib2 import re class TestProxy(object): def __init__
在Python编程中,验证代理IP的有效性是一项常见的任务,...以上就是关于Python验证代理IP有效性的基本知识和实践方法,以及可能的优化策略。通过这样的方式,你可以快速筛选出可用的代理IP,以满足各种网络访问需求。
在验证IP时,更新其有效性状态。 4. **代理IP池维护** 为了保持代理IP池的活力,需要定期运行`check_ips.py`脚本,剔除无效或性能不佳的IP。可以设置定时任务(如使用`schedule`库或Linux的cron job)来执行此过程...
如果IP可用,它会将其打印到标准输出。 4. 函数`check_for_gae`是针对GAE服务的IP检测。它调用了 `_check` 函数,但具体实现没有给出。通常,这个函数会通过发起HTTP请求到指定的GAE应用ID来判断IP的可用性。 5. ...
此外,验证IP有效性时可能需要多次尝试或使用不同的目标URL,因为某些代理可能只对特定站点有效。在处理大量IP时,还应考虑多线程或多进程以提高效率。最后,确保你的爬虫行为符合网站的使用条款,尊重数据的版权和...
3. **代理验证**:获取到代理IP后,需要验证其是否可用。可以尝试向一个已知网站发送请求,根据响应判断代理是否正常工作。可以使用`requests`库的`Session`对象,以便在多次请求之间保持相同的会话状态,包括代理...
# 在验证IP代理后,调用store_valid_proxy将结果存入数据库 ``` 最后,将以上功能整合,形成完整的获取、验证和存储IP代理的流程: ```python def main(): api_url = "http://your-proxy-api-url.com" # 替换为...
用telnet来验证ip是否可用 把有效的ip写入到本地txt中。当然也可以写入到redis、mongodb中,也可以设置检测程序当代理池中的ip数不够(如:小于20个)时,启动该脚本来重新获取ip,本脚本的代码也要做相应的改变。...
获取到代理IP和端口后,我们需要验证它们是否可用。这通常通过向某个网站发送带有代理设置的请求来实现。Python的`requests`库支持设置代理,我们可以使用`proxies`参数。 3. **验证代理IP**: - 设置代理:`...
综上所述,"GitHub Python IP代理池"项目是一个综合运用了Python编程、数据库操作、网络请求、代理验证、多线程和API设计等技术的实用工具。用户在使用前需正确安装所有依赖,并遵循`README.md`中的说明进行配置和...
3. **速度测试**:除了验证是否可用,还需要考虑代理IP的速度。较慢的代理可能会影响爬虫的效率。可以计时发送多次请求,计算平均响应时间。 4. **匿名级别**:代理IP有透明、普通、高匿名等不同级别。高匿名代理能...
2. **代理IP验证**:由于免费或共享的代理IP稳定性不佳,需要通过验证其可用性,例如使用`requests`库发送GET请求并检查响应状态码。例如: ```python import requests def is_proxy_valid(proxy): try: ...
3. **代理验证**:获取到的代理IP并非都可用,需要验证其有效性。可以通过向知名网站发送请求并检查响应时间及返回状态来判断。例如,可以使用requests库的`timeouts`参数和`status_code`属性。 4. **代理池设计**...
使用python3从西刺代理网获取国内高匿代理IP地址,并多线程进行验证,可用的代理保存至本地
该Python脚本是一个用于检测Google IP可用性的工具,主要针对Google App Engine (GAE) 服务和搜索服务。脚本需要Python 3.4或更高版本,并使用了多个Python库来实现其功能。以下是该脚本涉及的关键知识点: 1. **...
所以用Python写了个脚本,该脚本可以把能用的代理IP检测出来。 脚本如下: #encoding=utf8 import urllib2 from bs4 import BeautifulSoup import urllib import socket User_Agent = 'Mozilla/5.0 (Windows NT 6.3...
本文将探讨如何使用Python来创建这样一个代理IP池,并通过获取和验证代理IP来确保其可用性。 首先,我们需要理解代理IP的基本作用。当进行网络爬虫时,如果频繁地从同一IP地址访问某个网站,可能会触发网站的反爬...
2. **获取代理IP**:使用`proxybroker`获取可用的动态代理IP,存储在一个列表中供后续使用。 3. **登录QQ空间**:使用Selenium模拟浏览器打开QQ空间登录页面,填写账号密码并登录。可能需要处理滑块验证码,使用...
1. IP地址的表示与验证:在Python中,我们可以使用内置的`ipaddress`模块来处理IP地址。这个模块提供了创建、操作和验证IPv4和IPv6地址的能力。例如,你可以通过`ipaddress.ip_address()`函数来创建一个IP地址对象,...