欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于搜狗微信爬取微信公众号的文章

程序员文章站 2022-06-16 08:06:00
...

1. 引入模块和函数


from requests_html import HTMLSession
from urllib.parse import urlparse, parse_qs
import pprint
import time,datetime
import pandas as pd
from random import  random

2.页面爬取代码

def sogou_weixin(url,params):
    r = session.get(url, params = payload)
    # 先取特定元素, 精准打击其子后辈
    主要元素 =r.html.xpath('//div[@class="news-box"]/ul[@class="news-list"]/li')
    dict_xpath={
         'text_content':{
             '标题':'//div[@class="txt-box"]/h3/a',
             '内容':'//div[@class="txt-box"]/p',
#              '公众号名称':'//div[@class="txt-box"]/div[@class="s-p"]/a'

         },
        'href':{
            '文章链接':'//div[@class="txt-box"]/h3/a',
            '公众号链接':'//div[@class="txt-box"]/div[@class="s-p"]/a'
        },
         'time':{
               '发布时间':'//div[@class="txt-box"]/div[@class="s-p"]/@t'
         }
    }
    def text_content(_xpath_):
        参数暂存=[a.xpath(_xpath_)[0].lxml.text_content() for a in 主要元素]
        return(参数暂存)
    #"https://weixin.sogou.com"
    def href(_xpath_):
        参数暂存=[list(a.xpath(_xpath_)[0].absolute_links)[0] for a in 主要元素]
        return(参数暂存)
        #print(参数暂存)
    def time(_xpath_):
    #     #timeArray = time.localtime()
    #     #return _xpath_import time, datetime
         otherStyleTime = [a.xpath(_xpath_)[0] for a in 主要元素 ]
         return otherStyleTime
    #    参数暂存=
    数据字典={k:text_content(v) for k,v in dict_xpath['text_content'].items()}
    数据字典.update({k:href(v) for k,v in dict_xpath['href'].items()})
    数据字典.update({k:time(v) for k,v in dict_xpath['time'].items()})
    #pprint.pprint(数据字典)
    数据=pd.DataFrame(数据字典)

    数据=数据.assign(
        格式化时间=lambda x:pd.to_datetime(x['发布时间'],unit='s').dt.strftime('%Y-%m-%d %H:%M:%S')
    ).drop('发布时间',axis=1)
    return 数据

3.拆解url以获取爬取页数

 

session =HTMLSession()
#url选择文章或者公众号其中一条url进行拆解分析
url="https://xxx"
r=session.get(url)

翻页a='//div[@id="pagebar_container"]/a'
list_df = list()
href_列表=["https://weixin.sogou.com/weixin"+a.xpath('a/@href')[0] for a in r.html.xpath(翻页a)]
# print(href_列表)
df=pd.DataFrame([urlparse(x) for x in href_列表])
df
df_qs=pd.DataFrame([{ k:v[0] for k,v in parse_qs(x).items()}  for x in df['query']])
df_qs=df_qs.assign(int_page=df_qs.page.astype(int))
长度=int(df_qs.int_page.max()+1)
长度

def 拆解参数(url):
    six_part=urlparse(url)
    out=parse_qs(six_part.query)
    return out
#举一例调用
e= 拆解参数(href_列表[0])
def 参数调整(page,query,_type):
    参数=e.copy()
    参数['type']=_type
    参数['query']=query
    参数['page']=page
    return 参数
长度=df_qs.int_page.max()+1
长度#看到有多少页
#修改参数,生成参数字典,_type=["1"]是搜文章,2是搜公众号,query=["搜索的关键词"]
参数_keyword_调整={ i:参数调整(page=[i],query=["江门文旅"],_type=["2"] \
                       )\
                        for i in range(1,长度) }
参数_keyword_调整

3.for循环实现翻页爬取

for k,v in 参数_keyword_调整.items():
    payload=v
    print("payload",payload)
    #print(url)
    df = sogou_weixin(url, params = payload)
    time.sleep(30+100*random())  #大概两分钟左右一页,太快会被封!!!
    display(df)
    df = df.assign (页码 = k)  # 区分  curPage
    list_df.append(df)
df_all = pd.concat(list_df).reset_index()
df_all.index.name = '序号'
df_all

 这样就爬取到链接啦!!!基于搜狗微信爬取微信公众号的文章

温馨提示:最好使用代理IP爬取,否则会有被封ip的可能

相关标签: Python数据爬取