Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息
时间:2022-07-25
本文章向大家介绍Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
少年最好的地方就是:虽然嘴上说要放弃,心底却总会憋着一口气。——刘同
文章目录
一、需求和网页分析
你是否有特别喜欢的一些公众号文章,比如说关于网易云热评的。
我那么多遗憾,那么多期盼,你知道吗
下面以在搜狗里搜索 网易云热评墙 为例,爬取得到的全部文章信息(包括标题、日期、链接),并保存到Excel,使用Selenium来实现。
找到搜索框和搜文章按钮的位置
找到想要爬取的数据
10页之后的内容,要扫码登录才能继续获取。
二、selenium爬虫
- selenium是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,可以通过代码控制与页面上元素进行交互,并获取对应的信息。
- selenium很大的一个优点是:不需要复杂地构造请求,访问参数跟使用浏览器的正常用户一模一样,访问行为也相对更像正常用户,不容易被反爬虫策略命中,容易实现所见即所得。
- 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
import time
import datetime
import logging
import random
import openpyxl
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['num', 'title', 'date', 'link'])
# 配置chromedriver
chrome_driver = r'D:pythonpycharm2020chromedriver.exe'
# 关闭左上方 Chrome 正受到自动测试软件的控制的提示
options = webdriver.ChromeOptions()
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option("excludeSwitches", ['enable-automation'])
browser = webdriver.Chrome(executable_path=chrome_driver, options=options)
browser.get('https://weixin.sogou.com/')
# browser.maximize_window()
# 设定最长等待时间 在10s内发现了输入框已经加载出来后就输入“网易云热评墙”
wait = WebDriverWait(browser, 10)
_input = wait.until(ec.presence_of_element_located((By.NAME, 'query')))
# 搜索框中输入内容
_input.send_keys('网易云热评墙')
# class定位 模拟点击搜文章
browser.find_element_by_xpath("//input[@class='swz']").click()
num = 0
def get_news():
# 全局变量 统计文章数 记序
global num
article_lis = browser.find_elements_by_xpath('//ul[@class="news-list"]/li')
for article in article_lis:
num += 1
# 获取文章title
title = article.find_element_by_xpath('.//h3/a').text
# 获取文章发表日期
date = article.find_element_by_xpath('.//span[@class="s2"]').text
# 文章发表的日期如果较近可能显示的为 1天前 12小时前 30分钟前 需要进行处理
# 可以用 datetime 模块根据时间差求出具体时间
# 然后格式化为 2020-8-31 这样的格式
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 = (today - delta).strftime('%Y-%m-%d')
# 获取链接
link = article.find_element_by_xpath('.//h3/a').get_attribute('href')
sheet.append([num, title, date, link])
print(num, title, date)
print(link)
print('*' * 25)
for i in range(10):
get_news()
if i == 9:
# 如果访问到第十页则跳出循环 不需要点击“下一页”
break
browser.find_element_by_id("sogou_next").click()
# 休眠 防止爬取过快 中途又让扫码登录
time.sleep(random.randint(3, 5))
# 点登录
browser.find_element_by_name('top_login').click()
# 等待扫码登录上去 直到可以再点击下一页 退出循环
while True:
try:
next_page = browser.find_element_by_id("sogou_next")
break
except Exception as e:
logging.info(e.args[0])
time.sleep(2)
next_page.click()
# 登录上后 继续爬取文章信息
while True:
get_news()
try:
browser.find_element_by_id("sogou_next").click()
time.sleep(random.randint(3, 5))
# 直到不存在下一页 爬取结束
except Exception as e:
logging.info(e.args[0])
break
# 保存数据 输出日志信息 退出浏览器
wb.save(filename='articles_info.xlsx')
logging.info(f'共获取{num}条文章信息')
browser.quit()
运行效果如下:
2020-08-31 12:33:37,169 - INFO: 共获取957条文章信息
作者:叶庭云 公众号:微信搜一搜【修炼Python】 分享Python爬虫、数据分析、数据可视化、机器学习有关知识和实例;也分享实用的资料教程、软件工具、学习文档和简历模板。发现求知的乐趣,在不断总结和学习中进步。坚持输出优质文章,期待你的关注,一起交流学习,互相成就。 发现求知的乐趣,在不断总结和学习中进步,与诸君共勉。
- C# 读取指定文件夹下所有文件
- ASP.NET 实现Base64文件流下载PDF
- MVC自定义视图引擎地址
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
- impdp异常中断导致的问题(r2第8天)
- 利用autocomplete.js实现仿搜索效果(ajax动态获取后端[C#]数据)
- sql语句的简化(r2第7天)
- Ajax jsonp 跨域请求实例
- asp.net动态解析用户控件(UserControl)
- 找到多个与名为“Home”的控制器匹配的类型的解决方案
- 关于sequence问题的紧急处理(r2第26天)
- 使用动态变量进行动态数据比较(r2笔记25天)
- MVC分部视图@Html.Partial
- 基于马尔科夫链的产品评估预测
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小妹妹,我想握着你的手,不为别的,只为给你讲清楚CVE-2020-5902
- 不是吧?阿sir!周末你就不学习了吗?
- 灰盒方式通关WebGoat8
- 调试支付宝脱机认证接口遇到的问题总结
- 换一种姿势挖掘任意用户密码重置漏洞
- 表哥,有没有XMLDecoder反序列化的案例?
- 不得不说,minigui真的很坑
- 树的遍历总结
- ggplot2|详解八大基本绘图要素
- LDheatmap|SNP连锁不平衡图(LD)可视化,倒三角图?
- Oracle 表分区笔记
- Java并发编程
- 让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
- ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)
- R-plotly|甘特图(Gantt chart)- 一不小心年中了,立个flag