Python开发 - 微信公众号文章采集
优采云 发布时间: 2020-08-17 18:52Python开发 - 微信公众号文章采集
去年九月, 写了一篇爬取微信公众号的文章: PHP开发-微信公众号文章采集原理及思路下文出现的 "那篇文章"就是这个.
最近在玩 Python , 就找一些站点学习了一下, 想起之前使用 PHP 爬微信公众号的文章, 就再度看了 PHP开发-微信公众号文章采集原理及思路 这篇文章, 发现搜狗有个更新造成那篇文章已经无法爬了..
上图是之前那篇文章的, 那篇文章的爬取原理一句话讲完就是, 使用 PHP 爬到了 HTML 内容, 再获取到这个 data-share 属性, 就可以恳求 data-share 属性的链接领到文章内容.
再来瞧瞧现今的搜狗搜索陌陌文章:
可以看见, 搜狗早已把 data-share 属性给除去了, 只留下了 href 属性. 使用程序恳求 href 属性的链接, 会发觉被反爬了, 比如使用 Postman 或 PHP 用 file_get_contents 函数恳求, 就会看见返回的数据有如此一段:
请求的时侯使用 curl 并携带 cookie 的话, 就会返回(本文使用 Postman):
将返回的字符串进行拼接, 就可以得到一段 URL , 再恳求这个 URL 就领到了文章的 HTML 了, 接下来就不用多说了...
上面思路的测试都是使用 Postman 请求, 按理说使用 PHP 或者其他程序恳求结果也是一致的, 但是对 cookie 之类的这些操作太麻烦了, 所以使用 Python 重新实现了一遍, 用了 Selenium, 除了爬陌陌的, 还有一些网站是使用 JS 处理的, 比如阿里的商品详情, 有兴趣的话可以去尝试学习一下, 会发觉反爬机制更厉害.
关于 Selenium 可以百度或则微软搜索一下, 大白话的说就是他可以打开一个浏览器的框, 然后执行打开网页之类的操作, 这时候并不需要再伪造 UA 或者另外存 cookie 再进行携带恳求的, 因为它本身就是浏览器. 如果有兴趣 还可以搜一下: 模拟浏览器行为
先是安装 Python 环境, 这个就不多说...
环境变量简单说一下, 需要设置的环境变量如下图, 一般情况下 Python 默认安装路径是这个: C:\用户\用户名\AppData\Local\Programs\Python\Python38 最后的 Python38 是依据版本而定的.
安装 Selenium, 执行命令:
pip install selenium
安装浏览器驱动, 驱动下载: 浏览器驱动和浏览器版本须要对应, 比如:
浏览器版本是 81.0.4044.122 就可以下载这种驱动:
驱动可以放到某个目录下, 比如 D 盘下的 webdrivers 目录. 执行下边博主写的代码能够运行微信公众号文章的爬取了, 根据自己的需求可以继续编撰代码:
from selenium import webdriver
import time
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
lst_url = []
page_num = 2 # 想要爬取的页数
keyword = "百度" # 关键词
# 以下代码的 11002601 可能会因为搜狗更新而变更 需执行代码前自行查看搜狗搜索结果的 DOM
def get_article_url():
article_num = 10; # 定义每页的文章数量
for i in range(0, article_num):
url = wd.find_element_by_xpath(f'//*[@id="sogou_vr_11002601_title_{i}"]').get_attribute("href")
lst_url.append(url)
wd.get("https://weixin.sogou.com/")
wd.find_element_by_xpath('//*[@id="query"]').send_keys(keyword)
wd.find_element_by_xpath('//*[@id="searchForm"]/div/input[3]').click()
get_article_url()
if page_num >= 2:
for x in range(2, page_num + 1):
wd.find_element_by_xpath(f'//*[@id="sogou_page_{x}"]').click()
get_article_url()
for key, url in enumerate(lst_url):
wd.get(url)
time.sleep(3)
title = wd.find_element_by_xpath('//*[@id="activity-name"]').text
file = open(f"{title} - {key}.html", 'w', encoding = "utf-8")
#file.write(wd.find_element_by_xpath('//*[@id="js_article"]').get_attribute('innerHTML'))
file.write(title)
file.close()
wd.close()
如果不会使用前面代码, 可以在桌面创建一个 wx 文件夹, 进入文件夹再创建一个 wx.py 文件并将里面代码复制进去保存, 然后使用 CMD 或者其他命令行工具步入到桌面, 执行命令:
python wx.py