Eastmoney-Spyder:股吧网页数据抓取分析(三)

前言

看过我前两篇文章的朋友应该对本次项目非常熟悉了,这里就不再赘述。大家在进行抓取过程中会发现一个致命的问题,就是还没有抓取几个网页,自己的IP就被网站屏蔽了,博主也是这样,所以今天给大家介绍一下IP代理池的内容。事先声明一下,本文介绍的IP代理池并不能完全解决IP被屏蔽的问题,我这里只提供给大家一种思路,如何真正有效获取到数据需要大家自己去探索,有新方法的朋友欢迎私信我或在下方评论,仅供学习和交流!谢谢!

一、项目说明

数据来源:热门个股吧
数据字段:阅读、评论、标题、作者、更新时间
实现功能:读取每个股吧的全部页面的数据并写入excel表中

二、问题重述

Eastmoney-Spyder:股吧网页数据抓取分析(一)
Eastmoney-Spyder:股吧网页数据抓取分析(二)
股吧中全部发帖信息较多,很容易在抓取过程中被屏蔽IP导致抓取失败,如果你在抓取过程中发现,任意打开一个股吧的网址,出来的都是股市实战吧、财经评论吧,那么很不幸,你的IP也被屏蔽了!解决办法就是使用IP代理池,今天主要给大家介绍两种方法。
在这里插入图片描述

  1. 第一种方法是使用下面这位大神的分享内容(Proxy Pool),优点是开源免费,缺点就是代理IP不稳定且部署比较麻烦。
    【Proxy Pool】
  2. 第二种方法就是使用代理商提供的IP代理接口,嫌麻烦的朋友可以使用这种方法,当然过程中也会收取一些合理的费用。

因为部署较为繁琐,所以本次先跟大家介绍下第一种方法,第二种方法可以关注下一次的博客。

二、实施过程

系统环境:Windows 10
Python环境:Python 3.7
Redis环境:Redis-x64-5.0.10

1.为什么需要建立爬虫代理IP池

在众多的网站防爬措施中,有一种是根据IP访问频率进行限制的,在某段时间内,当某个IP的访问量达到一定的阀值时,该IP会被拉黑或在一段时间内被禁止访问。
这种时候,可以通过降低爬虫的频率,或者更改IP来应对。后者就需要有一个可用的代理IP池,以供爬虫工作时切换。


2.系统环境配置

Ⅰ. Python环境配置

  1. 这次使用的是github这个开源代理ip池,先下载解压好。
    Python爬虫代理IP池(proxy pool)
    在这里插入图片描述
  2. 配置好所需要的Python虚拟环境
 pip install -r requirements.txt
  1. 更新代理池的配置文件
# 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数据库环境配置

  1. 下载并配置Redis数据库环境。
    关于Redis数据库,大家可能比较陌生,REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
    我自己使用的版本已经上传到我的资源了,无需积分,只希望大家可以给个关注点个赞!谢谢!
    【其他版本资源地址】
    详细内容我猜你也不想知道,接下来看我怎么使用就行。
  2. Resis下载成功后,目录文件如下图所示,主要分为客户端服务端
    服务端用来开启Redis服务,客户端则用来修改Redis的一些配置。
    在这里插入图片描述
  3. 切换目录到Redis的安装目录,启动服务端程序,注意不要关闭这个cmd的窗口
redis-server.exe redis.windows.conf

在这里插入图片描述

  1. 另开启一个 cmd 窗口启动客户端,原来的不要关闭,不然就无法访问服务端了
redis-cli.exe -h 127.0.0.1 -p 6379

在这里插入图片描述

  1. 设置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:5010api接口服务:
apimethodDescriptionarg
/GETapi介绍None
/getGET随机获取一个代理None
/get_allGET获取所有代理None
/get_statusGET查看代理数量None
/deleteGET删除代理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. 常见问题

  1. 验证IP代理成功的方法
    打开http://127.0.0.1:5010/get/页面,不断刷新,查看IP地址是否变化:
    在这里插入图片描述
  2. IP代理池的不稳定体现
    在这里插入图片描述

总结

IP代理池针对某些特定网址来说确实很实用,但也不是万能的,加上代理池本身的不稳定,在抓取网页过程中依然会出问题,感兴趣的朋友可以尝试获取稳定的代理IP。

点个赞加个关注再走啦!

关于博主

知乎:南浔Pyer
CSDN:南浔Pyer
个人网站:DL小站
GitHub:LeoWang91
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南浔Pyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值