怎么使用Python爬取代理IP验证有效性?
2022-10-11
在爬虫工作的过程中,往往是因为IP受到允许访问公开数据,无法继续下去,工程师们也很聪明,购买代理IP,自己搭建IP甚至在网上抓取免费代理IP。众所周知,网络上有很多免费代理。IP我们可以选择一个或多个网站作为代理IP爬取并存储csv通过多个过程验证文件中的爬行IP的可用性。
通过requests和lxml爬取和分析网页。
在爬行之前,我们首先设置请求头,模拟普通浏览器访问网页。
headers={
accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
accept-encoding:"gzip,deflate",
accept-language:"zh-CN,zh;q=0.9",
cache-control:"no-cache",
connection:"keep-alive",
host:"www.******.com",
if-none-match:"W/\"61f3e567b1a5028acee7804fa878a5ba\"",
upgrade-insecure-requests:"1",
user-agent:"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/64.0.3282.119Safari/537.36"
}
通过lxml的css选择一切ip拼接地址和端口,然后一行一行地写入csv文件中。
代码如下:
defgetProxyList(target_url=TARGET_URL,pages=1):
"""
爬取代理IP地址
:paramtarget_url:爬取的代理IP网址
:return:
"""
proxyFile=open(FILE_NAME,"a+",newline="")
writer=csv.writer(proxyFile)
r=requests.get(target_url+pages,headers=headers,timeout=2.5)
document_tree=lxml.html.fromstring(r.text)
rows=document_tree.cssselect("#ip_listtr")
rows.pop(0)
forrowinrows:
tds=row.cssselect("td")
proxy_ip=tds[1].text_content()
proxy_port=tds[2].text_content()
proxy_addr=tds[3].text_content().strip()
writer.writerow([proxy_ip,proxy_port,proxy_addr])
proxyFile.close()
设置爬行页面进行循环,爬行地址写入csv文件中。但是之前发布的一些代理IP不能使用的可能性更大,可以爬到前5页左右。
在验证代理IP通过添加进程池来验证每个代理的可行性IP验证方法即可。requests的session网络访问可以持续进行。
defverifyProxies(verify_url,file_path=FILE_NAME):
session=requests.session()
proxyFile=open(FILE_NAME,"r+")
csv_reader=csv.reader(proxyFile)
p=Pool(10)
forrowincsv_reader:
proxies={"http":"http://"+row[0]+":"+row[1]}
p.apply_async(verifyProxy,args=(verify_url,proxies,session))
p.close()
p.join()
proxyFile.close()
验证每个IP通过发送网页的方式GET请求,然后根据返回状态码进行判断,并执行相应的操作。在请求中设置timeout需要使用try-except抛出异常,否则超过timeout相应的过程将在设定值时终止。
声明:本文来自网络投稿,不代表IPIDEA立场,若存在侵权、安全合规问题,请及时联系IPIDEA进行删除。