python3 scrapy爬取微信公众号及历史信息V1.0

作者: 简书用户9527 | 来源:发表于2018-02-26 22:33 被阅读614次
    妹子图.png

    环境:

    python3 scrapy

    目的

    写这篇文章主要是做一下纪念,毕竟是搞了快两天的东西了,今天加大了量,使用scrapy爬取100多个微信公众号,然后出现IP被封的情况下,当然了,这种情况并不是没有办法解决,只需要在scrapy中进行设置一下就可以了,主要是在本地进行调试,然后IP代理池那一块暂时找不到好的质量高的IP,只是爬取了各大网站的免费IP,并没有很好的解决效果,这个版本只要在IP中稍微进行下设置调整,可以不愧为一个很好的爬取微信公众号历史消息的一个小案例。

    爬取步骤

    1. 找到公众号


      image.png
    2. 获取历史消息


      image.png
    3. 获取详情页内容


      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 scrapy
    import re
    import time
    import json
    import requests
    from fake_useragent import UserAgent
    from scrapy import Request
    from scrapy_redis.spiders import RedisSpider
    from News_scrapy.items import NewsItem
    from News_scrapy.constants.WeChatSource import WXSource
    
    class 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

    很蛋疼吧,哈哈,哎。

    放上自己小小的学习交流群吧
    Python自学交流群(702689263)

    相关文章

      网友评论

        本文标题:python3 scrapy爬取微信公众号及历史信息V1.0

        本文链接:https://www.haomeiwen.com/subject/xekhtftx.html