基于Python采集器的最便捷的微信公众号文章下载器
优采云 发布时间: 2020-08-07 06:18所以我想知道是否有任何方法可以下载这些官方帐户文章. 在这种情况下,似乎很方便. 但是在线方法要么太复杂(对我来说,是新手爬虫的初学者),要么付钱.
但是我的需求实际上非常简单-“容易找到/检索/浏览相关官方帐户中的任何文章”,因此在进行一些学习和检索之后,我开始制作一个小工具(打包成可执行文件)) ,尽管方法和代码非常简单,但实际上手工使用起来非常方便. 我也向安利挥了挥手.
工具要求:
2个现有计划
我还搜索了有关在互联网上抓取微信官方帐户的一些信息. 可能有以下几种类型.
硒爬网过程AnyProxy代理批量采集Fiddler设置代理和数据包捕获
通过捕获和分析多个帐户,我们可以确定:
可能的问题:
如果您只想抓取文章的内容,似乎没有访问频率的限制,但是如果您要捕获阅读次数和喜欢的次数,则在一定频率后,返回值将变为空值.
付费平台
例如,如果您只想查看Qingbo的新列表,则可以直接查看每日列表,而无需花钱. 如果您需要访问自己的系统,它们还提供api接口
3个项目的第3.1步基本原理
目标爬网网站收录微信平台上大多数高质量的微信官方帐户文章,这些文章将定期更新. 经过测试,发现它对爬虫更友好.
1. 网站页面的布局和排版规则,通过链接中的帐户来区分不同的官方帐户
2. 在公共帐户集合下的文章翻页也是正常的: 每翻页ID号+12
Portal.png
所以流程的想法是
3.2环境3.3官方帐户信息检索
通过向目标url发起requset请求,获取页面html信息,然后调用常规方法以匹配两条信息
1. 官方帐户存在吗?
2. 如果存在,那么文章中最多的页面数是什么?
url = 'http://chuansong.me/account/' + str(name) + '?start=' + str(0)
wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封
time.sleep(wait)
html = get_one_page(url)
pattern1 = re.compile('Page Not Found.', re.S)
item1 = re.findall(pattern1, html) # list类型
pattern2 = re.compile('(.\d+)(\s*)(\s*?)下一页')
item2 = re.findall(pattern2, html) # list类型
if item1:
print("\n---------该账号信息尚未收录--------\n")
exit();
else:
print("\n---------该公众号目前已收录文章页数N为:",item2[0][0])
存在正式帐户后,直接致电请求以解决目标请求链接.
#需要加一个请求头部,不然会被网站封禁
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status #若不为200,则引发HTTPError错误
response.encoding = response.apparent_encoding
return response.text
except:
return "产生异常"
请注意,目标采集器网站必须添加标头,否则它将直接拒绝访问
3.4定期分析,提取链接和文章标题
以下代码用于解析html文本中的链接和标题文本信息
def parse_one_page(html):
pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"timestamp".*?">(.*?)', re.S)
items = re.findall(pattern, html)
return items
3.5自动跳转页面
以下代码通过循环递增分配来更改url中的页码参数.
def main(offset, i):
url = 'http://chuansong.me/account/' + str(offset) + '?start=' + str(12*i)
print(url)
wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封
time.sleep(wait)
html = get_one_page(url)
for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
print(info)
#info.strip('\"') #这种去不掉首尾的“
#info = info[1:-1] #这种去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
3.6删除标题中的非法字符
由于Windows下有file命令,因此无法使用某些字符,因此我们需要使用常规消除符
itle = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['标题'])
3.7将html转换为PDF
使用pandas的read_csv函数读取抓取的csv文件,并在“链接”,“标题”,“日期”之间循环
然后通过调用pdfkit函数转换并生成PDF文件
wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封
time.sleep(wait)
path = get_path(offset)
path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安装wkhtmltopdf的位置
config = pdfkit.configuration(wkhtmltopdf = path_wk)
if path == "" :
print("尚未抓取该公众号")
else:
info = get_url_info(offset)
for indexs in info.index:
url = info.loc[indexs]['链接']
title = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['标题'])
date = info.loc[indexs]['日期']
wait = round(random.uniform(4,5),2) # 设置随机爬虫间隔,避免被封
time.sleep(wait)
print(url)
with eventlet.Timeout(4,False):
pdfkit.from_url(url, get_path(offset)+'\\'+ date+'_'+title+'.pdf', configuration=config)
print('转换成功!')
3.8生成的PDF结果
结果4.png
4个结果显示4.1抓取结果
结果1.png
已抓取的几个正式帐户存储在文件夹中

文件夹目录下的内容
已抓取CSV内容格式
4.2工具运行示例
1.png
检查微信官方帐户的名称
2.png
输入官方帐户名称和下载的页面数
3.png
下载内容
5个完整代码
由于转换为PDF的稳定性,因此我没有在发行版的代码中添加转换到PDF的功能. 保留了一个大致的py源文件. 如果有兴趣,读者可以自己调整和修改.
点击获取代码
6个exe文件下载链接
点击此处获取工具下载链接