不败君

前端萌新&初级后端攻城狮

Python开发 - 微信公众号文章采集

Python开发 - 微信公众号文章采集

2020-04-24 18:20:00

围观(555)

去年九月, 写了一篇爬取微信公众号的文章: PHP开发-微信公众号文章采集原理及思路 下文出现的 "那篇文章"就是这个.


最近在玩 Python , 就找一些站点学习了一下, 想起之前使用 PHP 爬微信公众号的文章, 就再次看了 PHP开发-微信公众号文章采集原理及思路 这篇文章, 发现搜狗有个更新导致那篇文章已经没法爬了..

1.png

上图是之前那篇文章的, 那篇文章的爬取原理一句话讲完就是, 使用 PHP 爬到了 HTML 内容, 再获取到这个 data-share 属性, 就可以请求 data-share 属性的链接拿到文章内容.

再来看看现在的搜狗搜索微信文章:

2.png

可以看到, 搜狗已经把 data-share 属性给去掉了, 只留下了 href 属性. 使用程序请求 href 属性的链接, 会发现被反爬了, 比如使用 Postman 或 PHP 用 file_get_contents 函数请求, 就会看到返回的数据有这么一段:

3.png


请求的时候使用 curl 并携带 cookie 的话, 就会返回(本文使用 Postman):

4.png

将返回的字符串进行拼接, 就可以得到一段 URL , 再请求这个 URL 就拿到了文章的 HTML 了, 接下来就不用多说了...

5.png


上面思路的测试都是使用 Postman 请求, 按理说使用 PHP 或者其他程序请求结果也是一致的, 但是对 cookie 之类的那些操作太麻烦了, 所以使用 Python 重新实现了一遍, 用了 Selenium, 除了爬微信的, 还有一些网站是使用 JS 处理的, 比如阿里的商品详情, 有兴趣的话可以去尝试学习一下, 会发现反爬机制更厉害.


关于 Selenium 可以百度或者谷歌搜索一下, 大白话的说就是他可以打开一个浏览器的框, 然后执行打开网页之类的操作, 这时候并不需要再伪造 UA 或者另外存 cookie 再进行携带请求的, 因为它本身就是浏览器. 如果有兴趣 还可以搜一下: 模拟浏览器行为

先是安装 Python 环境, 这个就不多说...


环境变量简单说一下, 需要设置的环境变量如下图, 一般情况下 Python 默认安装路径是这个: C:\用户\用户名\AppData\Local\Programs\Python\Python38 最后的 Python38 是根据版本而定的.

6.png

安装 Selenium, 执行命令:

pip install selenium

安装浏览器驱动, 驱动下载: https://chromedriver.storage.googleapis.com/index.html 浏览器驱动和浏览器版本需要对应, 比如:

7.png

浏览器版本是 81.0.4044.122 就可以下载这些驱动:

8.png

驱动可以放在某个目录下, 比如 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

9.png

执行完成后打开桌面的 wx 文件夹:

10.png

可以看到全部爬取的文件, 最后还是要说一下, 请勿用于非法用途, 本文提供的代码也仅仅作为分享学习使用. 所造成的一切后果请自行承担.

本文地址 : www.bubaijun.com/page.php?id=176

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语