微信公众号文章爬虫

优采云 发布时间: 2020-08-27 08:38

  微信公众号文章爬虫

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

  

  搜索结果

  //*[@id="sogou_vr_11002301_box_n"]/div/div[2]/p[1]/a

  http://mp.weixin.qq.com/profile?src=3&timestamp=1508003829&ver=1&signature=Eu9LOYSA47p6WE0mojhMtFR-gSr7zsQOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==

  

  只有10条文章达不到要求

   //其中biz值就是微信公众号的唯一id值。前面和后面省略了大部分代码;该段代码位于script标签里面;该代码还有最近10条文章的数据,如果单纯想获取最近10条,可以通过正则表达式来直接获取   var biz = "MzIwNDA1OTM4NQ==" || "";   var src = "3" ;    var ver = "1" ;    var timestamp = "1508003829" ;    var signature = "Eu9LOYSA47p6WE0mojhMtFR-gSr7zsQOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==" ;    var name="python6359"||"python";

  获取到微信公众号的id值以后,就是要获取wap_sid值(即单个微信公众号的文章权限值。)这个部份从陌陌客户端获取,接下来通过Fiddler抓包工具获取,如果不知道抓包工具的环境搭建,可以参考 fiddler抓取摩拜自行车数据包

  获取的wap_sid2和__biz值

  # -*- coding: utf-8 -*- import scrapy from scrapy import Request from .mongo import MongoOperate import json from .settings import * class DataSpider(scrapy.Spider):     name = "data"     allowed_domains = ["mp.weixin.qq.com"]     start_urls = ['https://mp.weixin.qq.com/']     count=10     url="https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz={biz}&f=json&offset={index}&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=ULeI%2BILkTLA2IpuIDqbIla4jG6zBTm1jj75UIZCgIUAFzOX29YQeTm5UKYuXU6JY&wxtoken=&appmsg_token=925_%252B4oEmoVo6AFzfOotcwPrPnBvKbEdnLNzg5mK8Q~~&x5=0&f=json"     def start_requests(self):       MongoObj=MongoOperate(MONGO_URI,MONGO_DATABASE,MONGO_USER,MONGO_PASS,RESPONSE)         MongoObj.connect()         items=MongoObj.finddata()         for item in items:             headers={                 'Accept-Encoding':'gzip, deflate',                 'Connection':'keep-alive',                 'Accept':'*/*',                 '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': '62526065241838a5d44f7e7e14d5ffa3e87f079dc50a66e615fe9b6169c8fdde0f7b9f36f3897212092d73a3a223ffd21514b690dd8503b774918d8e86dfabbf46d1aedb66a2c7d29b8c*敏*感*词*f017eadee6',                 '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")

  

  最终捕获的数据

  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

  链接:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线