微信爬爬猫---公众号文章抓取代码分析

参考静幽水博客:分三个py抓取:

1)获取公众号历史文章链接

2)通过第一篇历史文章链接进行文章数据下载

3)将excel数据分为各个txt作为文章保存

首先对公众号的文章进行链接抓取:

通过公众号进行超链接,可以进行文章数据一览:

打开F12:可以查看相关cookie

 

 此时进行页面分析:

可以看到链接地址为:https://mp.weixin.qq.com/cgi-bin/

后续的为cookie自带,进行cookie分析:

 可以看见页面的存于cookie处,可以在发送数据流时携带上cookie信息

继续查看payload:

根据分析,可以发现有两个值是需要修改的:

fakeid:公众号的唯一标识,即每个公众号靠这个值进行标志位,要爬取哪个公众号则去界面获取改址

token:登录的公众号所携带的唯一值,注意这个值会一段时间失效,需要更新

begin:页数值,对公众号历史数据进行自动翻页时可自动更新

根据分析可知,构建header利用cookie、user-agent,data则直接用payload属性,要注意的是翻翻爬,用随机数取值进行抓取

所以可以构建抓取链接代码:

# -*- coding: utf-8 -*-
import requests
import time
import csv
import pandas as pd
import random
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"

headers = {
  "Cookie": "appmsglist_action_3075757661=card; RK=I358n36vGe; ptcz=5448f88bf04a668969598e3e2389441098ce9ddfda625f5b3405b800ef3f6a3e; tvfe_boss_uuid=fca1d4a6c63a3f4e; pgv_pvid=2326326083; eas_sid=9116B307v3V2p9h9T3W5f7j1N2; uin_cookie=o1650253487; ied_qq=o1650253487; pgv_info=ssid=s848222700; tokenParams=?e_code=441370; _qpsvr_localtk=0.21233149564781995; ptui_loginuin=1650253487; uin=o1650253487; skey=@ptW4pJmtG; lolqqcomrouteLine=a20211030conex_a20211030conex_a20211030conex; ua_id=3QlQS1oIhbQ2o5myAAAAAF1OP6DSCWkZCv_3lfiQlwM=; wxuin=37977470512230; uuid=155dc1786136e244ac3124732eb58899; rand_info=CAESIITQyKkWW+AMBCN3ygonTbtMs6YX6Y+cLvl67B5fbNY6; slave_bizuin=3075757661; data_bizuin=3001490327; bizuin=3075757661; data_ticket=UBD3S4kMWzQujI/FbTvBTseUgydYUol29ZKJaQKFDAfCKAu1Jtw2tEnTbCvxZoLV; slave_sid=MWtrVGt2WkQ3d0cwbVpSa0YyRjlzNU96RzhGdDczV05lMEZrS0JHaGtUM1NQWDJIekdUNnZ0amw3UV9oUVluQjdqU3E5ZmhadVVFQ0piOUFueklOMzdKVUxRNlczSEN4MElMVGRsc1ZLVnNoY1hoSFN1WUFXZnk5Wkh1cFQ2a1hwWjJ4QlVIc2RieXZlc0NJ; slave_user=gh_7d6f1b66482c; xid=b5c0f845d26a64a44d4756ced783f4f3; mm_lang=zh_CN; rewardsn=; wxtokenkey=777",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
}

data = {
    "token": "1512659433",
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1",
    "action": "list_ex",
    "begin": "0",
    "count": "5",
    "query": "",
    "fakeid": "Mzg3MDA5ODY1NA==",
    "type": "9",
}

content_list = []
for i in range(23):
    data["begin"] = i*5
    time.sleep(random.randint(1,5))//反反爬
    content_json = requests.get(url, headers=headers, params=data).json()
    for item in content_json["app_msg_list"]:    
        items = []
        items.append(item["title"])
        items.append(item["link"])
        content_list.append(items)
    print(i)
name=['title','link']
test=pd.DataFrame(columns=name,data=content_list)
test.to_csv("hello.csv",mode='a',encoding='utf-8')

通过第一部分代码可以获取微信公众号所有的链接,继而通过第二部分代码,进行链接中文字的信息获取:

import pandas as pd
import requests
from lxml import etree

class WeixinSpider_1:
    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}

    def get_url_list(self):
        file_path = "./hello.csv"
        df = pd.read_csv(file_path)
        url_list = df["link"].tolist()
        #time_list = df["create_time"].tolist()  
        print(len(url_list))
        return url_list

    def parse_url(self, url):  
        response = requests.get(url, headers=self.headers)
        return response.content.decode()

    def get_content_list(self, html_str):  # 提取数据
        html = etree.HTML(html_str)
        content_list = []
        item = {}
        item["title"] = html.xpath("//*[@id=\"activity-name\"]/text()")
        item["title"] = [i.replace("\n", "").replace(" ", "") for i in item["title"]]
        item["laiyuan"] = html.xpath("//*[@id=\"js_name\"]/text()")
        item["laiyuan"] = [i.replace("\n", "").replace(" ", "") for i in item["laiyuan"]]
        item["other"] = html.xpath("//*[@id=\"js_content\"]//text()")
        
        content_list.append(item)
      
        return content_list

    def save_html(self, html_str, page_name):
        file_path = "html/lufa/{}.html".format(page_name)
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(html_str)    

    def run(self):  
        # 获取url列表和时间列表
        url_list= self.get_url_list()
        items = []

        # 打开数据库连接(ip/数据库用户名/登录密码/数据库名)
        #db = pymysql.connect("localhost", "root", "root", "weixin_database")

        # 使用 cursor() 方法创建一个游标对象 cursor
        #cursor = db.cursor()
        
        # 遍历url列表,发送请求,获取响应
        for url in url_list:
            num = url_list.index(url)
            print(num)
            # 解析url,获得html
            html_str = self.parse_url(url)
            # 获取内容
            content_list = self.get_content_list(html_str)
            # list转字符串
            title = ''.join(content_list[0]["title"])
            other = '\n'.join(content_list[0]["other"])
            # 根据下标取发布时间
            contents = []
            contents.append(title)
            contents.append(other)
            #create_time = time_list[num]
            items.append(contents)
            print(title)
            print(other)

        name=['title','content']
        test=pd.DataFrame(columns=name,data=items)
        test.to_csv("wuhan-data.csv",mode='a',encoding='utf-8')

if __name__ == '__main__':
    weixin_spider = WeixinSpider_1()
    weixin_spider.run()

第二部分完后可直接进行第三部分:txt分页,将excel中每一列数据分开为txt保存,如下代码:

import pandas as pd


file_path = "./wuhan-data.csv"
df = pd.read_csv(file_path)
title_list = df["title"].tolist()
content_list = df["content"].tolist()
for i in range(len(title_list)):
    with open(title_list[i]+'.txt', 'w') as f:
        f.write(content_list[i])

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值