本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

文章转载于公众号:早起Python

作者:陈熹

大家好,今天我们来讲点Selenium自动化,你是否有特别喜欢的公众号?你有想过如何将一个公众号历史文章全部文章爬下来学习吗?现在我们就演示用Selenium实现这个功能。

下面就来详细讲解如何一步步操作,文末附完整代码。

Selenium介绍

Selenium是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,可以通过代码控制与页面上元素进行交互,并获取对应的信息。Selenium很大的一个优点是:不需要复杂地构造请求,访问参数跟使用浏览器的正常用户一模一样,访问行为也相对更像正常用户,不容易被反爬虫策略命中,所见即所得。而且在抓取的过程中,必要时还可人工干预(比如登录、输入验证码等)。

Selenium常常是面对一个严格反爬网站无从入手时的保留武器。当然也有缺点:操作均需要等待页面加载完毕后才可以继续进行,所以速度要慢,效率不高(某些情况下使用headless和无图模式会提高一点效率)。

需求分析和代码实现

需求很明确:获取一个公众号全部推文的标题、日期、链接。微信自身的推文功能只能通过其App查看,对App的抓取比较复杂。有一个很方便的替代途径就是通过搜狗微信检索。不过如果直接使用Requests等库直接请求,会涉及的反爬措施有cookie设置,js加密等等,所以今天就利用Selenium大法!

首先导入所需的库和实例化浏览器对象:

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.wait import WebDriverWait

# 导入第2-4行是为了马上会提到的 显式等待

import time

import datetime

driver = webdriver.Chrome()

driver.get('https://weixin.sogou.com/')

上述的代码就可以实现打开搜狗微信搜索的操作,接下来需要往搜索框里输入文字,并且点击“搜文章”(不直接点搜公众号是因为已经取消通过公众号直接获取相应文章的功能)

wait = WebDriverWait(driver, 10)

input = wait.until(EC.presence_of_element_located((By.NAME, 'query')))

input.send_keys('早起Python')

driver.find_element_by_xpath("//input[@class='swz']").click()

逻辑是设定最长等待时间,在10s内发现了输入框已经加载出来后就输入公众号名称,这里我们以“早起Python”为例,并且根据“搜文章”按钮的xpath获取该位置并点击,这里就用到了显式等待。Selenium请求网页等待响应受到网速牵制,如果元素未加载全而代码执行过快就会意外报错而终止,解决方式是等待。

隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间driver.implicitly_wait(10),显示等待明确了等待条件,只有该条件触发,才执行后续代码,如这里我用到的代码,当然也可以用time模块之间设定睡眠时间,睡完了再运行后续代码。

另外只能获取前10页100条的结果,查看后续页面需要微信扫码登录:

因此从这里开始,代码的执行逻辑为:第10页遍历完成后自动点击登录,此时需要人工介入,扫码完成登录

代码检测登录是否完成(可以简化为识别“下一页”按钮是否出现),如果登录完成则继续从11页遍历到最后一页(没有“下一页”按钮)

由于涉及两次遍历则可以将解析信息包装成函数:

num = 0

def get_news():

global num # 放全局变量是为了给符合条件的文章记序

time.sleep(1)

news_lst = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")

for news in news_lst:

# 获取公众号来源

source = news.find_elements_by_xpath('div[2]/div/a')[0].text

if '早起' not in source:

continue

num += 1

# 获取文章标题

title = news.find_elements_by_xpath('div[2]/h3/a')[0].text

# 获取文章发表日期

date = news.find_elements_by_xpath('div[2]/div/span')[0].text

# 文章发表的日期如果较近可能会显示“1天前” “12小时前” “30分钟前”

# 这里可以用`datetime`模块根据时间差求出具体时间

# 然后解析为`YYYY-MM-DD`格式

if '前' in date:

today = datetime.datetime.today()

if '天' in date:

delta = datetime.timedelta(days=int(date[0]))

elif '小时' in date:

delta = datetime.timedelta(hours=int(date.replace('小时前', ' ')))

else:

delta = datetime.timedelta(minutes=int(date.replace('分钟前', ' ')))

date = str((today - delta).strftime('%Y-%m-%d'))

date = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m-%d')

# 获取url

url = news.find_elements_by_xpath('div[2]/h3/a')[0].get_attribute('href')

print(num, title, date)

print(url)

print('-' * 10)

for i in range(10):

get_news()

if i == 9:

# 如果遍历到第十页则跳出循环不需要点击“下一页”

break

driver.find_element_by_id("sogou_next").click()

接下来就是点击“登录”,然后人工完成扫码,可以利用while True检测登录是否成功,是否出现了下一页按钮,如果出现则跳出循环,点击“下一页”按钮并继续后面的代码,否则睡3秒后重复检测:

driver.find_element_by_name('top_login').click()

while True:

try:

next_page = driver.find_element_by_id("sogou_next")

break

except:

time.sleep(3)

next_page.click()

效果如图:

然后就是重新遍历文章了,由于不知道最后一页是第几页可以使用while循环反复调用解析页面的函数半点击“下一页”,如果不存在下一页则结束循环:

while True:

get_news()

try:

driver.find_element_by_id("sogou_next").click()

except:

break

# 最后退出浏览器即可

driver.quit()

是不是少了点什么?对,就是数据存储,在爬下来数据之后和之前一样利用openpyxl存储到excel中即可(如果不想用此模块的话也可以改用 csv 或者 pandas 保存表格文件):

python爬虫微信公众号文章_Python爬虫案例:爬取微信公众号文章相关推荐

  1. 如何用python爬取公众号文章_Python+fiddler:爬取微信公众号的文章

    这几天师父有个小项目,挺有意思,如何使用python爬微信公众号中的新闻信息.大体流程如下.图1:流程 其实我们看到,这里并没有想象中的"智能"--依然需要手动刷公众号文章,然后才 ...

  2. python爬取微信公众号_python使用webdriver爬取微信公众号

    本文实例为大家分享了python使用webdriver爬取微信公众号的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- from selenium import we ...

  3. Python爬虫实战项目案例——爬取微信朋友圈

    项目实战   Appium爬取微信朋友圈   自动化爬取App数据 基于移动端的自动化测试工具Appium的自动化爬取程序. 步骤 1.JDK - Download JDK,Appium要求用户必须配 ...

  4. python爬取文章保存为txt_爬取博主所有文章并保存到本地(.txt版)--python3.6

    闲话: 一位前辈告诉我大学期间要好好维护自己的博客,在博客园发布很好,但是自己最好也保留一个备份. 正好最近在学习python,刚刚从py2转到py3,还有点不是很习惯,正想着多练习,于是萌生了这个想 ...

  5. python爬取公众号阅读量_Python爬虫实践:如何快速、高效的爬取微信公众号阅读在看数...

    自从2013年,自媒体开始崛起.再到2014年,自媒体开始能够赚钱,自媒体逐渐成为这个时代的一个趋势性的潮流. 随着公众号平台的不断火爆,各个自媒体平台如春笋班拔地而起.自媒体的蓬勃发展,很大程度上重 ...

  6. python爬虫高级知识分子的风骨_Python程序员爬取《万物理论》10万影评,带你解读霍金的有趣故事...

    相信昨天的Breaking news(爆搜)是本世纪伟大的物理学家霍金辞世,享年76岁.小伙伴肯定知道霍金的故事肯定很励志,他是智商肯定不是常人能及的,因为他的引领,不断的拓宽了人类对宇宙的认识. 作 ...

  7. python多线程爬取_python 多线程方法爬取微信公众号文章

    ''' fh=open("/home/urllib/test/1.html","wb") fh.write(html1.encode("utf-8&q ...

  8. python 批量打开网页并截图_Python静态网页爬取:批量获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  9. python批量访问网页保存结果_Python静态网页爬取:批量获取高清壁

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  10. python write非法字符报错_Python爬虫实现的微信公众号文章下载器

    平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否 ...

最新文章

  1. 图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别
  2. 算法------数组---------存在重复元素
  3. java xxtea加密,base64和Xxtea的加密和解密
  4. 视频操作_02视频追踪:meanshift算法+Camshift算法
  5. html-css练习题 (注册表单)
  6. 虚拟服务器的好处与坏处,常见服务器虚拟化的弊端主要是什么问题?
  7. Python接口自动化-requests模块之post请求
  8. keep it SMPL: Automatic estimation of 3d human pose and shape from a single image
  9. ssh: connect to host github.com port 22: Connection refused
  10. 逻辑谬误_Java性能的9个谬误
  11. 朱令被投毒案关键人物语料分析之孙维篇
  12. 微带线和带状线的设计指南
  13. IE,谷歌访问跨域问题
  14. Docker方式部署Github监控系统Hawkeye
  15. H5新特性 - 新增标签
  16. FI: FICO期初数据
  17. IDEA配置关联Git
  18. 杰理AC692X,695X,696X方案NFC音响耳机、故事机
  19. 单片机4人抢答器程序C语言,基于单片机的4人抢答器.pdf
  20. 手机端操作| Auto.js一键解密/一键加密工具免费分享

热门文章

  1. 能打开2D、3D图文件的小工具abviewer
  2. sqlmap安装总结
  3. sqlmap安装历程
  4. unity AI Planner 人工智能简介
  5. 3D视觉是CV技术的未来!对话奥比中光CEO黄源浩
  6. 百胜erp加密狗驱动_百胜分销系统ERP_DRP用户手册.pdf
  7. 52个外文文献论文网站,写论文的你必囤!
  8. 关于echarts3总chinamap的配置问题
  9. 计算机课集体备课,《计算机应用基础》集体备课方案
  10. SQL语句执行优先级