妹子图.png
环境:
python3 scrapy
目的
写这篇文章主要是做一下纪念,毕竟是搞了快两天的东西了,今天加大了量,使用scrapy爬取100多个微信公众号,然后出现IP被封的情况下,当然了,这种情况并不是没有办法解决,只需要在scrapy中进行设置一下就可以了,主要是在本地进行调试,然后IP代理池那一块暂时找不到好的质量高的IP,只是爬取了各大网站的免费IP,并没有很好的解决效果,这个版本只要在IP中稍微进行下设置调整,可以不愧为一个很好的爬取微信公众号历史消息的一个小案例。
爬取步骤
找到公众号
image.png
获取历史消息
image.png
获取详情页内容
image.png
还有第4步:
将详情页内容解析出来,图片,文字都单独拎出来,现在暂时不做处理,因为这一块有些麻烦的。逻辑整体就是这样。
python代码
这里是spider的代码,其他的就不用贴出来了:
spiders/WeChatSogou.py
# -*- coding: utf-8 -*-# @Time : 2018/2/25 14:24# @Author : 蛇崽# @Email : 643435675@QQ.com# @File : WeChatSogou.py(微信公众号爬虫:不包含浏览量跟评论)import scrapyimport reimport timeimport jsonimport requestsfrom fake_useragent import UserAgentfrom scrapy import Requestfrom scrapy_redis.spiders import RedisSpiderfrom News_scrapy.items import NewsItemfrom News_scrapy.constants.WeChatSource import WXSourceclass WeChatSogouSpider(scrapy.Spider): name = "WeChat" allowed_domains = ["weixin.sogou.com",'mp.weixin.qq.com'] start_urls = ['http://weixin.sogou.com/'] def parse(self, response): wx_source = WXSource.get_dict() for v_wx_source in wx_source: print('wx_source ===',v_wx_source) try: type = v_wx_source.split('-')[0] channel = v_wx_source.split('-')[1] print("正在抓取:", type, channel) v_main_url = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query={}'.format(channel) print('v_main_url',v_main_url) yield scrapy.Request(url=str(v_main_url),callback=self.parse_main_link,meta={'type':type}) except: continue print('wx_source error ===', v_wx_source) def parse_main_link(self,response): print('parse_main_link ==== ',response.body) target_url = response.xpath("//*['txt-box']/p[@class='tit']/a/@href").extract_first() print('===== start =====') print('target_url',target_url) print('==== end =====') if target_url: yield scrapy.Request(url=target_url,callback=self.parse_list_gzhao) def parse_list_gzhao(self,response): print('resonse: ',response) req_text = response.text reg_content_url = r'"content_url":"(.*?)",' m_infos = re.findall(reg_content_url, req_text, re.S) print(len(m_infos)) for v_info in m_infos: v_info = 'https://mp.weixin.qq.com' + re.sub('&', '&', v_info) print(v_info) yield scrapy.Request(url=v_info,callback=self.parse_detail) def parse_detail(self, response): print('parse_detail ===== ',response.text)
注意事项:1 allowed_domains = ["weixin.sogou.com",'mp.weixin.qq.com'] 2 reg_content_url = r'"content_url":"(.*?)",' 这里通过正则方式获取每个详情页链接的url,因为原文用的js动态加载的,
下面这是注意事项2的截图:
image.png
很蛋疼吧,哈哈,哎。
作者:徐代龙
链接:https://www.jianshu.com/p/3d89c225ed39
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦