作者:仙焕来源:Python技术经常有粉丝在后台留言,问:大哥,你的爬虫运行时怎么报错了?我让他把错误信息发给我,他看了之后叹了口气。大部分粉丝就是拿着代码开始
作者:仙焕
来源:Python技术
经常有粉丝在后台留言,问:大哥,你的爬虫运行时怎么报错了?
我让他把错误信息发给我,他看了之后叹了口气。
大部分粉丝就是拿着代码开始跑,然后等结果。他们根本没有仔细阅读和理解源代码。遇到错误,他们直接过来问。
爬虫源代码报告的大部分错误都是由于频繁访问目标网站,导致目标网站出现错误或无数据返回。
目前大部分网站都有反抓取措施。如果在一定时间内,IP请求数量超过一定阈值,就会触发反抓取措施,拒绝访问,也就是我们常说的“屏蔽IP”。
那么如何解决这个问题呢?
一种解决方法是减少访问频率,一次访问后等待一定时间,然后再次访问。这种方法对于防爬措施不严的网站是有效的。
如果遇到防爬措施严格的网站,访问次数多了还是会被屏蔽。有时你需要抓取数据。这种解决方案会使数据采集周期特别长。
第二个解决方案是使用代理IP。我不断切换IP访问,让目标网站以为是不同的用户在访问,从而绕过反抓取措施。这也是最常见的方式。
那么,我们就面临一个问题:哪里有那么多独立的IP地址?
当然,最便捷的方式还是花钱买服务。这种付费IP一般都是稳定可靠的。
今天就来说说不花钱免费获得代理IP的方法。
ProxyPool 简介
ProxyPool是crawler的代理IP池。其主要功能是定期收集网上发布的免费代理进行验证入库,定期验证入库代理,保证代理的可用性。它提供了API和CLI使用模式。
同时还可以拓展代理来源,增加代理池IP的质量和数量。
获取项目
我们可以通过两种方式获得ProxyPool项目。
第一种是通过命令行下载:
git克隆git @ github . com:jhao 104/proxy _ pool . git
第二种是下载相应的zip压缩包:
安装依赖
我们得到项目后,转到项目的根目录,运行下面的代码,安装项目所需的依赖包:
pip安装-r要求. txt
修改配置文件
为了在本地运行项目,我们需要为本地环境修改一些配置。打开项目中的setting.py文件,并根据本地环境和要求修改配置。
# setting.py为项目配置文件# = & # 34;0.0.0.0"# IPPORT = 5000 #监听端口#配置数据库DB _ CONN = & # 39redis://:pwd @ 127 . 0 . 0 . 1:8888/0 & # 39;# Configure proxy Fetcher proxy _ Fetcher =[& # 34;freeProxy01 & # 34,#这里是启用的代理提取方法的名称,所有提取方法都位于fetch er/proxy fetcher . py & # 34;freeProxy02 & # 34, # ...]主要修改的配置是监听端口(PORT)、Redis数据库的配置(DB_CONN)和启用的代理方法名(PROXY_FETCHER)。
启动项目
修改完配置,我们就可以愉快的使用了。
这个项目一般分为两部分:抓取代理IP和访问代理IP。
如果要启用搜索代理IP的服务,请直接运行以下命令:
python proxyPool.py计划
启动后,您可以看到以下控制台信息:
该计划将抓取每隔一段时间,直到有一定数量的可用IP在我们的IP池。
实际上,作者在这个项目中使用的是从一些免费代理网站收集IP,然后测试IP的可用性。如果可用,它将存储在Redis中,如果不可用,它将被丢弃。
所以你可以自己写程序来实现这个逻辑。
使用代理 IP
要使用代理IP,您需要启动webApi服务:
python代理池. py服务器
web服务启动后,默认会启动http://127.0.0.1:5010的api服务:
如果想在爬虫代码中使用,可以把这个api打包成一个函数,直接使用,例如:
import requests def get _ proxy():return requests . get(& # 34;http://127 . 0 . 0 . 1:5010/get/& # 34;).JSON()def delete _ proxy(proxy):requests . get(& # 34;http://127.0.0.1:5010/delete/?proxy = { } & # 34。format(proxy))#您的蜘蛛codedef getHtml(): #....retry_count = 5 proxy = get_proxy()。获取(& # 34;代理& # 34;)而retry _ count & gt0:try:html = requests . get(& # 39;http://www . example . com & # 39;,proxies = { & # 34http & # 34: "http://{ } & # 34;。format(proxy)}) #使用代理访问return HTML exception:retry _ count-= 1 #删除代理池中的代理delete_proxy(proxy) return None总结作为一个IP代理池对于学习来说,这一项已经获取的足够用了,但是对于一些复杂的爬虫项目或者商业项目来说,可能会比较困难。毕竟这个爬行免费的质量肯定没那么好,不稳定很正常。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/24476.html