首页 > 编程知识 正文

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

时间:2023-05-05 19:02:39 阅读:184236 作者:1421

1. 引入模块和函数

from requests_html import HTMLSessionfrom urllib.parse import urlparse, parse_qsimport pprintimport time,datetimeimport pandas as pdfrom random import random

2.页面爬取代码

def sogou_weixin(url,params): r = session.get(url, params = payload) # 先取特定元素, 精准打击其子jwdlz 主要元素 =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_列表])dfdf_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的可能

点击查看获得更加详细的介绍:基于搜狗微信爬取微信公众号的文章

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。