2019-10-20 14:15 2970浏览

扫码或搜索:进击的Coder

发送 E1371C

即可立即永久解锁本站全部文章

前面讲解了代理池的维护和付费代理的相关使用方法,接下来我们进行一下实战演练,利用代理来爬取微信公众号的文章。

1. 本节目标

我们的主要目标是利用代理爬取微信公众号的文章,提取正文、发表日期、公众号等内容,爬取来源是搜狗微信,其链接为 http://weixin.sogou.com/,然后把爬取结果保存到 MySQL 数据库。

2. 准备工作

首先需要准备并正常运行前文中所介绍的代理池。这里需要用的 Python 库有 aiohttp、requests、redis-py、pyquery、Flask、PyMySQL,如这些库没有安装可以参考第 1 章的安装说明。

3. 爬取分析

搜狗对微信公众平台的公众号和文章做了整合。我们可以通过上面的链接搜索到相关的公众号和文章,例如搜索 NBA,可以搜索到最新的文章,如图 9-21 所示。

图 9-21 搜索结果

点击搜索后,搜索结果的 URL 中其实有很多无关 GET 请求参数,将无关的参数去掉,只保留 type 和 query 参数,例如 http://weixin.sogou.com/weixin?type=2&query=NBA,搜索关键词为 NBA,类型为 2,2 代表搜索微信文章。

下拉网页,点击下一页即可翻页,如图 9-22 所示。

图 9-22 翻页列表

注意,如果没有输入账号登录,那只能看到 10 页的内容,登录之后可以看到 100 页内容,如图 9-23 和图 9-24 所示。

图 9-23 不登录的结果

图 9-24 登录后的结果

如果需要爬取更多内容,就需要登录并使用 Cookies 来爬取。

搜狗微信站点的反爬虫能力很强,如连续刷新,站点就会弹出类似如图 9-25 所示的验证。

图 9-25 验证码页面

网络请求出现了 302 跳转,返回状态码为 302,跳转的链接开头为 http://weixin.sogou.com/antispider/,这很明显就是一个反爬虫的验证页面。所以我们得出结论,如果服务器返回状态码为 302 而非 200,则 IP 访问次数太高,IP 被封禁,此请求就是失败了。

如果遇到这种情况,我们可以选择识别验证码并解封,也可以使用代理直接切换 IP。在这里我们采用第二种方法,使用代理直接跳过这个验证。代理使用上一节所讲的代理池,还需要更改检测的 URL 为搜狗微信的站点。

对于这种反爬能力很强的网站来说,如果我们遇到此种返回状态就需要重试。所以我们采用另一种爬取方式,借助数据库构造一个爬取队列,待爬取的请求都放到队列里,如果请求失败了重新放回队列,就会被重新调度爬取。

在这里我们可以采用 Redis 的队列数据结构,新的请求就加入队列,或者有需要重试的请求也放回队列。调度的时候如果队列不为空,那就把一个个请求取出来执行,得到响应后再进行解析,提取出我们想要的结果。

这次我们采用 MySQL 存储,借助 PyMySQL 库,将爬取结果构造为一个字典,实现动态存储。

综上所述,我们本节实现的功能有如下几点。

修改代理池检测链接为搜狗微信站点

构造 Redis 爬取队列,用队列实现请求的存取

实现异常处理,失败的请求重新加入队列

实现翻页和提取文章列表并把对应请求加入队列

实现微信文章的信息的提取

将提取到的信息保存到 MySQL

好,那么接下来我们就用代码来实现一下。

4. 构造 Request

既然我们要用队列来存储请求,那么肯定要实现一个请求 Request 的数据结构,这个请求需要包含一些必要信息,如请求链接、请求头、请求方式、超时时间。另外对于某个请求,我们需要实现对应的方法来处理它的响应,所以需要再加一个 Callback 回调函数。每次翻页请求需要代理来实现,所以还需要一个参数 NeedProxy。如果一个请求失败次数太多,那就不再重新请求了,所以还需要加失败次数的记录。

这些字段都需要作为 Request 的一部分,组成一个完整的 Request 对象放入队列去调度,这样从队列获取出来的时候直接执行这个 Request 对象就好了。

我们可以采用继承 reqeusts 库中的 Request 对象的方式来实现这个数据结构。requests 库中已经有了 Request 对象,它将请求 Request 作为一个整体对象去执行,得到响应后再返回。其实 requests 库的 get()、post() 等方法都是通过执行 Request 对象实现的。

我们首先看看 Request 对象的源码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

classRequest(RequestHooksMixin):

def__init__(self,

method=None,url=None,headers=None,files=None,data=None,

params=None,auth=None,cookies=None,hooks=None,json=None):

# Default empty dicts for dict params.

data=[]ifdataisNoneelsedata

files=[]iffilesisNoneelsefiles

headers={}ifheadersisNoneelseheaders

params={}ifparamsisNoneelseparams

hooks={}ifhooksisNoneelsehooks

self.hooks=default_hooks()

for(k,v)inlist(hooks.items()):

self.register_hook(event=k,hook=v)

self.method=method

self.url=url

self.headers=headers

self.files=files

self.data=data

self.json=json

self.params=params

self.auth=auth

self.cookies=cookies

这是 requests 库中 Request 对象的构造方法。这个 Request 已经包含了请求方式、请求链接、请求头这几个属性,但是相比我们需要的还差了几个。我们需要实现一个特定的数据结构,在原先基础上加入上文所提到的额外几个属性。这里我们需要继承 Request 对象重新实现一个请求,将它定义为 WeixinRequest,实现如下:

1

2

3

4

5

6

7

8

9

10

TIMEOUT=10

fromrequestsimportRequest

classWeixinRequest(Request):

def__init__(self,url,callback,method='GET',headers=None,need_proxy=False,fail_time=0,timeout=TIMEOUT):

Request.__init__(self,method,url,headers)

self.callback=callback

self.need_proxy=need_proxy

self.fail_time=fail_time

self.timeout=timeout

在这里我们实现了 WeixinRequest 数据结构。init() 方法先调用了 Request 的init() 方法,然后加入额外的几个参数,定义为 callback、need_proxy、fail_time、timeout,分别代表回调函数、是否需要代理爬取、失败次数、超时时间。

我们就可以将 WeixinRequest 作为一个整体来执行,一个个 WeixinRequest 对象都是独立的,每个请求都有自己的属性。例如,我们可以调用它的 callback,就可以知道这个请求的响应应该用什么方法来处理,调用 fail_time 就可以知道这个请求失败了多少次,判断失败次数是不是到了阈值,该不该丢弃这个请求。这里我们采用了面向对象的一些思想。

5. 实现请求队列

接下来我们就需要构造请求队列,实现请求的存取。存取无非就是两个操作,一个是放,一个是取,所以这里利用 Redis 的 rpush() 和 lpop() 方法即可。

另外还需要注意,存取不能直接存 Request 对象,Redis 里面存的是字符串。所以在存 Request 对象之前我们先把它序列化,取出来的时候再将其反序列化,这个过程可以利用 pickle 模块实现。

python hook 微信_Python3使用代理爬取微信公众号文章相关推荐

  1. 【python爬虫】一个简单的爬取百家号文章的小爬虫

    需求 用"老龄智能"在百度百家号中搜索文章,爬取文章内容和相关信息. 观察网页 红色框框的地方可以选择资讯来源,我这里选择的是百家号,因为百家号聚合了来自多个平台的新闻报道.首先看 ...

  2. 使用代理爬去微信公众号_Python3网络爬虫开发实战之使用代理爬取微信公众号文章...

    本节目标 我们的主要目标是利用代理爬取微信公众号的文章,提取正文.发表日期.公众号等内容,爬取来源是搜狗微信,其链接为 http://weixin.sogou.com/,然后把爬取结果保存到 MySQ ...

  3. Python3网络爬虫开发实战,使用IP代理爬取微信公众号文章

    前面讲解了代理池的维护和付费代理的相关使用方法,接下来我们进行一下实战演练,利用代理来爬取微信公众号的文章. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知 ...

  4. 使用代理爬去微信公众号_Python3WebSpider/9.5-使用代理爬取微信公众号文章.md at master · Lainton/Python3WebSpider · GitHub...

    9.5 使用代理爬取微信公众号文章 前面讲解了代理池的维护和付费代理的相关使用方法,接下来我们进行一下实战演练,利用代理来爬取微信公众号的文章. 1. 本节目标 我们的主要目标是利用代理爬取微信公众号 ...

  5. python自动推送消息_Python自动接收微信群消息并推送相应的公众号文章

    原标题:Python自动接收微信群消息并推送相应的公众号文章 封面图片:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 用书教师可以联系 ...

  6. python微信点赞脚本_Python爬取微信公众号评论、点赞等相关信息

    微信公众号爬虫方案分析(爬取文艺相处公众号) 之前考虑过使用搜狗微信来爬取微信公众号信息,不过搜狗提供的数据有诸多弊端,比如文章链接是临时的,文章没有阅读量等指标,所以考虑通过手机客户端利用 Pyth ...

  7. 使用代理爬去微信公众号_爬虫之使用代理爬取微信公众号文章(下)

    一 修改代理池 1 将代理池中TEST_URL的地址修改为:TEST_URL = 'https://weixin.sogou.com/weixin?type=2&query=NBA' 2 运行 ...

  8. Python爬虫开源项目代码(爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网 等等)...

    文章目录 1.简介 2.开源项目Github 2.1.WechatSogou [1]– 微信公众号爬虫 2.2.DouBanSpider [2]– 豆瓣读书爬虫 2.3.zhihu_spider [3 ...

  9. Python爬虫开源项目代码(爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网 等等)

    文章目录 1.简介 2.开源项目Github 2.1.WechatSogou [1]– 微信公众号爬虫 2.2.DouBanSpider [2]– 豆瓣读书爬虫 2.3.zhihu_spider [3 ...

最新文章

  1. 08day 数据泵(expdb/impdb)—数据导出
  2. argmax函数_Python科学计算库numpy——统计函数
  3. 夺命雷公狗---PDO NO:13 PDO的预处理查询4
  4. ~~spfa判断图中是否存在负环
  5. 【图像处理】MATLAB:彩色图像介绍
  6. Java的JDK以及maven环境变量配置
  7. 秀米编辑器使用html,秀米编辑器的操作步骤
  8. Linux常用查找命令
  9. 网络常用端口号大全----2
  10. Python爬虫实例项目大全
  11. 精心梳理二十二道常见SSM面试题(带答案)
  12. Chrome 页面呈现原理与性能优化(内附分享 ppt)
  13. 2019开源BI软件排行榜
  14. 基于信用卡业务测试数据支持解决方案
  15. Odoo(OpenERP)应用实践:代发货管理
  16. [高项]焦点小组VS名义小组技术VS引导式研讨会
  17. python—networkx:画随机几何图,找出中心节点并按路径长度染色
  18. DVWA靶场系列1-环境搭建
  19. linux中etc下的hosts(本地IP解析)文件详解
  20. 在线播放.html,网页嵌入式SWF视频播放器

热门文章

  1. OpenCV-最大极值稳定区域MSER分析
  2. 5、移植UBOOT之支持Nor Flash
  3. Tesseract在安装过程中出现Download error Status of equ: Send Request Error. Click OK to continue!!!已解决#附安装包
  4. 微信小程序反编译wxss文件缺失_如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李...
  5. SpringBoot学习笔记1 框架及基础配置
  6. onmousedown 与onmouseup事件在一个按钮中同时调用
  7. 监控直播——安防产品的多功能应用
  8. 满减优惠卷(LevOJ P1552)
  9. 长沙米维长沙本土的手机软件开发公司
  10. 【web渗透】Windows自带的Certutil的使用