栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

微信公众号文章爬虫

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微信公众号文章爬虫

很多的微信公众号都提供了质量比较高的文章阅读,对于自己喜欢的微信公众号,所以想做个微信公众号爬虫,爬取相关公众号的所有文章。抓取公众号的所有的文章,需要获取两个比较重要的参数。一个是微信公众号的唯一ID(__biz)和获取单一公众号的文章权限值wap_sid2。接下来说一下思路。

  • 爬取思路:

    http://weixin.sogou.com/weixin?type=1&s_from=input&query=python&ie=utf8&_sug_=n&_sug_type_=


    • 下面是搜索的结果页面:

    • 要想获取微信公众号的爬虫,首先要唯一标识这个微信公众号,所以要获取这个微信公众号的id值(即__biz)。看了比较多的相关文章,很多获取__biz的值比较机械,单纯手动复制取__biz;现在搜狗引擎与微信公众号对接,为我们提供了一个很好的获取途径,微信公众号源码里面有该号的__biz值(可以从这个途径获取);但是搜狗引擎对微信公众号有限制,只显示最近10条文章,所以我们单纯只从搜狗引擎获取__biz值和通过搜狗搜索任意关键词公众号列表。

    • 下面是搜狗搜索微信公众号的URL地址,其中query的python是搜索的关键词,其他可以不变。

 搜索结果

  • 查看源代码,可以发现每一个公众号的链接,都是位于id为sougou_vr_11002301_box_n(n为整数如1,2,3等)下面的a标签href属性值。通过xpath语法可以获取,其中n的位置可以按规律顺序获取:

/*;q=0.8',       'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN',       'Accept-Language':'zh-cn',       'Accept-Encoding':'gzip, deflate',       'Connection':'keep-alive',       'cookie':'wxuin=1563216401;pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU;ua_id=Wz1u21T8nrdNEyNaAAAAAOcFaBcyz4SH5DoQIVDcnao=;pgv_pvid=7103943278;sd_cookie_crttime=1501115135519;sd_userid=8661501115135519;3g_guest_id=-8872936809911279616;tvfe_boss_uuid=8ed9ed1b3a838836;mobileUV=1_15c8d374ca8_da9c8;pgv_pvi=8005854208',       'Referer':"https://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5MzI5MTQ1Mg==&devicetype=iOS10.0.1&version=16051220&lang=zh_CN&nettype=WIFI&ascene=3&fontScale=100&pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU&wx_header=1"


HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Cache-Control: no-cache, must-revalidate Strict-Transport-Security: max-age=15552000 Set-cookie: wxuin=1563216401; Path=/; HttpOnly Set-cookie: pass_ticket=ji+3JbA2NNExGwdNCoIa91sbgwDmSmHsdZhHP5eo+gun+y2V3lxc34GQy3W5u8mE; Path=/; HttpOnly Set-cookie: wap_sid2=CJGUs+kFElxER01KN1ZkVElJMUdhTktDUUk2LUZHNkFwT1Rzc1EwUWpWaW5ZMHlFQi15cUo1VWFjamNLM3pjdzNCbDc2ZFZpOW0xeDdPb0czWXNuQUdmbVdyOFZiNTREQUFBfjC+7YvPBTgMQJRO; Path=/; HttpOnly Connection: keep-alive Content-Length: 37211


# -*- coding: utf-8 -*- from scrapy import Spider,Request from .mongo import MongoOperate import re from wechatSpider.items import GetsessionspiderItem from .settings import * class GetsessionSpider(Spider):     name = "getSession"     allowed_domains = ["mp.weixin.qq.com"]     start_urls = ['https://mp.weixin.qq.com/']     headers={         'Host':'mp.weixin.qq.com',         # 'X-WECHAT-KEY': 'a83687cde3ca46be517cdbcba60732159f229a03507e9afa1e0dfee00e3cf00562aee022e84b9011924fdbb0c7af8c647c33b1338b11ebdc8893d5df41dd34a536e1af5b48d15c87b4aef629ad8685f3',         'X-WECHAT-KEY': '33c1fdebcfc1d1ecd9df5003dc9d9ccb6a1f5458eb704e58a05e80c73e8793dede6b52115a74a515d4d12c9a6f2d8f00238afe17cca3635d80d661a612a4a0bf48a2547516b12030efd8a224548636d2',         'X-WECHAT-UIN':'MTU2MzIxNjQwMQ%3D%3D',         'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,**',                 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN',                 'Accept-Language': 'zh-cn',                 'X-Requested-With': 'XMLHttpRequest',                 'X-WECHAT-KEY': '62526065241838a5d44f7e7e14d5ffa3e87f079dc50a66e615fe9b6169c8fdde0f7b9f36f3897212092d73a3a223ffd21514b690dd8503b774918d8e86dfabbf46d1aedb66a2c7d29b8cc4f017eadee6',                 'X-WECHAT-UIN': 'MTU2MzIxNjQwMQ%3D%3D',                 'cookie':';wxuin=1563216401;pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU;ua_id=Wz1u21T8nrdNEyNaAAAAAOcFaBcyz4SH5DoQIVDcnao=;pgv_pvid=7103943278;sd_cookie_crttime=1501115135519;sd_userid=8661501115135519;3g_guest_id=-8872936809911279616;tvfe_boss_uuid=8ed9ed1b3a838836;mobileUV=1_15c8d374ca8_da9c8;pgv_pvi=8005854208'             }             biz=item["biz"]       #主要验证是wap_sid2;pass_ticket不一样无所谓             headers["cookie"]="wap_sid2="+item["wap_sid2"]+headers["cookie"]             yield Request(url=self.url.format(biz=biz,index="10"),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers},)     def parse(self, response):         biz=response.request.meta["biz"]         headers=response.request.meta["headers"]         resText=json.loads(response.text)         print(resText)         list=json.loads(resText["general_msg_list"])         print(list)         yield list         if resText["can_msg_continue"]==1:             self.count=self.count+10             yield Request(url=self.url.format(biz=biz,index=str(self.count)),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers})         else:             print("end")


  • 获取到的数据如下图所示:

 最终捕获的数据

  • 在爬取的过程中,有时候经过抓包,想获取一个重定向的网页的响应头;但是响应头cookies已经设置read only,我们想通过这里获取权限值,可以通过设置Fiddler的rules来生成保存响应文件。在微信文章爬取过程中,虽然也是想通过这种方式获取权限值。但是发觉自己是忽略了请求头x-wechat-key和x-wechat-uin所以获取不到。所以这种方式在该项目并不需要。但是提供一种获取动态设置cookies值,然后重定向到新页面的响应头方法,比如获取 https://mp.weixin.qq.com/mp/profile_ext?action=home
         查看Fiddlerscript

  • 在Fiddler添加以下代码,然后在桌面生成一个2.txt文件,上面保存返回的响应头:

static function onBeforeResponse(oSession: Session) {       if (oSession.HostnameIs("mp.weixin.qq.com") && oSession.uriContains("/mp/profile_ext?action=home")) {           oSession["ui-color"] = "orange";           oSession.SaveResponse("C:\Users\Administrator\Desktop\2.txt",false);           //oSession.SaveResponseBody("C:\Users\Administrator\Desktop\1.txt")       }       if (m_Hide304s && oSession.responseCode == 304) {           oSession["ui-hide"] = "true";       }   }

     响应头      哈哈

源代码的readme.md文件介绍使用的方式,需要可以直接到github上面获取源码,github源码地址;喜欢的给个star哟。
其他类似文章



作者:Evtion
链接:https://www.jianshu.com/p/67a8f5c92b49


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/220333.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号