基于搜狗微信爬取微信公众号的文章
程序员文章站
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的可能