大家好,我是小焦。今天给大家来说一说微信公众号的爬虫,提起这个爬虫我也是一肚子气。为什么呢?本来计划好好的,要做几个功能的。结果人算不如天算,只能草草了事了。老马的反爬还是有点厉害的。最初的设想是爬到公众号的文章,然后找到我们需要的公众号,然后将里面的内容提取的。结果遇到反爬,换cookie,使用selenium都会被检测到。技术薄微,也只能暂时止步。
爬虫思路:
起初,我是准备写一个类,完成爬取动作,后期进行调用的,结果发现没有函数好用,就进行了修改。整体流程就是利用搜狗微信的功能,来完成指定公众号的文章爬取。然后将文章链接保存到word文档中。
在研究搜狗微信的过程中,发现了几个小毛病。搜狗微信就跟搜索引擎差不多,作者发表一篇文章,要隔断时间才会在它上面显示,有的快有的慢。包括微信客户端,手机上推文和电脑端的也有时间差,有的甚至一直没更新。这也是我放弃此爬虫的原因吧。好了不讲这些了,来看看下面的代码吧,作为小白,乱写一通,大神不喜勿喷啊。
准备工作:
- python3
- 调用的库:requests,urllib,pyquery,time,docx-python,datetime
这几个库就不用多做解释了,会爬虫的小伙伴经常会用到。docx是word的库,pyquery是解析库,大伙都认识。下面是我写的代码,大家仅供参考吧。
# 2020年8月29日
# 本次目标利用搜狗微信网站,进行指定公众号文章最新内容爬取。
import requests
from urllib.parse import quote
from pyquery import PyQuery as pq
import time
from docx import Document
from datetime import datetime
import random
header = [
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser',
]
# 该函数获取结果页面内容
def get_page(page,name):
s = quote(name)
headers = {
'User-Agent':random.choice(header),
}
url = 'https://weixin.sogou.com/weixin?type=2&page={}&s_from=input&query={}&ie=utf8&_sug_=n&_sug_type_='.format(page,s)
a = requests.get(url,headers=headers)
return a.text
# 找出对应公众号的文章链接和标题,因为搜狗微信只显示前10页,所以我们也只抓取前10页,找出两天类的文章并输出
def get_article(name):
for i in range(1,11):
q = pq(get_page(i,name))
lists = q('.news-list li').items()
for list in lists:
if list('.s-p a').text() == name:
# 获取文章的时间戳
t = list('.s-p').attr('t')
# 这里是计算当前的时间戳
shijian = int(time.time())
# 这里是将两天内的文章搜索出来,并返回
if (shijian - int(t)) < 172800:
title = list('.txt-box h3 a ').text() # 获取文章标题
if title == '':
title = '无最新报价'
url = 'https://weixin.sogou.com' + list('.txt-box h3 a ').attr('href') # 获取文章链接
if url == '':
url = ''
print(title,url)
return title,url
# 上面函数已经拿到文章的名字和文章链接,现在来进行文章内容分析,(这块代码放弃了,因为公众号正文是反爬的加入cookie和selenium都会被劫住,所以暂时不搞这一块)
# def get_content(self,title,url):
# brower = webdriver.Chrome()
#
# time.sleep(2)
# print(url)
# brower.get(url)
# html = brower.page_source
# h = pq(html)
# print(h)
#
# # lists = h('.rich_media_content p').items()
# # for list in lists:
# #
# # print(list.text())
# 这里我们建立一个函数完成所有的文章标题链接写入到word文档中
lists = ['西安腾乐电子','西安新志电子']
def execute():
# 创建一个空文档
document = Document()
#给文档添加一个标题,后面加上时间
header = '公众号最新报价单({})'.format(datetime.now().strftime('%a,%b-%d %H:%M'))
document.add_heading(header,level=0)
for list in lists:
print(list)
time.sleep(3)
title,url = get_article(list)
if title == '':
continue
document.add_paragraph(title,style='List Number')
document.add_paragraph('链接:' + url + '\n')
document.add_paragraph('来自:' + list)
document.save('最新报价.docx')
if __name__ == '__main__':
execute()
源码地址:https://github.com/zhanjiuyou/weixin.git
上述代码中,第一个函数是为了完成指定公众号的搜索后,返回结果页的代码。第二个函数是对搜索结果前十页进行遍历,找出和我们搜索名字一直的公众号内容。由于搜出来的结果非常乱,没有排序,我们利用时间戳将最近一天的内容输出。第三个函数则是用docx库将输出的内容保存到我们的word文档中。
今天的内容就到这,代码很乱大伙自己看哦。不懂得方法进行资料查阅。最近小焦也在完成一个小小的爬虫项目。等完成之后再进行分享。更多内容关注我的公众号哦。合作请私聊。
评论抢沙发