前言
看过我前两篇文章的朋友应该对本次项目非常熟悉了,这里就不再赘述。大家在进行抓取过程中会发现一个致命的问题,就是还没有抓取几个网页,自己的IP就被网站屏蔽了,博主也是这样,所以今天给大家介绍一下IP代理池的内容。事先声明一下,本文介绍的IP代理池并不能完全解决IP被屏蔽的问题,我这里只提供给大家一种思路,如何真正有效获取到数据需要大家自己去探索,有新方法的朋友欢迎私信我或在下方评论,仅供学习和交流!谢谢!
一、项目说明
数据来源:热门个股吧
数据字段:阅读、评论、标题、作者、更新时间
实现功能:读取每个股吧的全部页面的数据并写入excel表中
二、问题重述
Eastmoney-Spyder:股吧网页数据抓取分析(一)
Eastmoney-Spyder:股吧网页数据抓取分析(二)
股吧中全部发帖信息较多,很容易在抓取过程中被屏蔽IP导致抓取失败,如果你在抓取过程中发现,任意打开一个股吧的网址,出来的都是股市实战吧、财经评论吧,那么很不幸,你的IP也被屏蔽了!解决办法就是使用IP代理池,今天主要给大家介绍两种方法。
- 第一种方法是使用下面这位大神的分享内容(Proxy Pool),优点是开源免费,缺点就是代理IP不稳定且部署比较麻烦。
【Proxy Pool】 - 第二种方法就是使用代理商提供的IP代理接口,嫌麻烦的朋友可以使用这种方法,当然过程中也会收取一些合理的费用。
因为部署较为繁琐,所以本次先跟大家介绍下第一种方法,第二种方法可以关注下一次的博客。
二、实施过程
系统环境:Windows 10
Python环境:Python 3.7
Redis环境:Redis-x64-5.0.10
1.为什么需要建立爬虫代理IP池
在众多的网站防爬措施中,有一种是根据IP访问频率进行限制的,在某段时间内,当某个IP的访问量达到一定的阀值时,该IP会被拉黑或在一段时间内被禁止访问。
这种时候,可以通过降低爬虫的频率,或者更改IP来应对。后者就需要有一个可用的代理IP池,以供爬虫工作时切换。
2.系统环境配置
Ⅰ. Python环境配置
- 这次使用的是github这个开源代理ip池,先下载解压好。
Python爬虫代理IP池(proxy pool))
- 配置好所需要的Python虚拟环境
pip install -r requirements.txt
- 更新代理池的配置文件
# setting.py 为项目配置文件
# 配置API服务
HOST = "0.0.0.0" # IP
PORT = 5010 # 监听端口
# 配置数据库
# 下一小节会提供下载教程
# 123456为设置的密码
# 127.0.0.1:6379为默认IP和端口不要改!!
DB_CONN = 'redis://:123456@127.0.0.1:6379/0'
# 配置 ProxyFetcher
# 不用管,默认就可以
PROXY_FETCHER = [
"freeProxy01", # 这里是启用的代理抓取方法名,所有fetch方法位于fetcher/proxyFetcher.py
"freeProxy02",
# ....
]
Ⅱ. Redis数据库环境配置
- 下载并配置Redis数据库环境。
关于Redis数据库,大家可能比较陌生,REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
我自己使用的版本已经上传到我的资源了,无需积分,只希望大家可以给个关注点个赞!谢谢!
【其他版本资源地址】
详细内容我猜你也不想知道,接下来看我怎么使用就行。 - Resis下载成功后,目录文件如下图所示,主要分为客户端和服务端。
服务端用来开启Redis服务,客户端则用来修改Redis的一些配置。
- 切换目录到Redis的安装目录,启动服务端程序,注意不要关闭这个cmd的窗口
redis-server.exe redis.windows.conf
- 另开启一个 cmd 窗口启动客户端,原来的不要关闭,不然就无法访问服务端了
redis-cli.exe -h 127.0.0.1 -p 6379
- 设置Redis的访问密码(123456:与代理池的配置相对应)
详细内容见我这一篇博客: Redis数据库密码设置
3.启动Proxy Pool项目
# 如果已经具备运行条件, 可用通过proxyPool.py启动。
# 程序分为: schedule 调度程序 和 server Api服务
# 启动调度程序
python proxyPool.py schedule
# 启动webApi服务
python proxyPool.py server
PS:README中提到的Docker运行就不用管啦!
4.封装函数写入爬虫
- 启动web服务后, 默认配置下会开启
http://127.0.0.1:5010
的api接口服务:
api | method | Description | arg |
---|---|---|---|
/ | GET | api介绍 | None |
/get | GET | 随机获取一个代理 | None |
/get_all | GET | 获取所有代理 | None |
/get_status | GET | 查看代理数量 | None |
/delete | GET | 删除代理 | proxy=host:ip |
- 我们将此api封装成函数,在爬虫代码中直接使用:
# api函数封装函数
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
# 爬虫代码部分
# 获取网页内容
def getHTMLText(url):
proxy = get_proxy()
# print(proxy) # 可以输出查看每次爬取时所用的IP地址
try:
# 使用代理访问
r = requests.get(url, proxies={"http": "http://{}".format(proxy)}, timeout=20)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except Exception:
print("获取" + str(url) + "网页内容失败!")
def ......
5. 常见问题
- 验证IP代理成功的方法
打开http://127.0.0.1:5010/get/
页面,不断刷新,查看IP地址是否变化:
- IP代理池的不稳定体现
总结
IP代理池针对某些特定网址来说确实很实用,但也不是万能的,加上代理池本身的不稳定,在抓取网页过程中依然会出问题,感兴趣的朋友可以尝试获取稳定的代理IP。
点个赞加个关注再走啦!