少年最好的地方就是:虽然嘴上说要放弃,心底却总会憋着一口气。——刘同
你是否有特别喜欢的一些公众号文章,比如说关于网易云热评的。
我那么多遗憾,那么多期盼,你知道吗
下面以在搜狗里搜索 网易云热评墙 为例,爬取得到的全部文章信息(包括标题、日期、链接),并保存到Excel,使用Selenium来实现。
找到搜索框和搜文章按钮的位置
找到想要爬取的数据
10页之后的内容,要扫码登录才能继续获取。
代码如下:
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:\python\pycharm2020\chromedriver.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爬虫、数据分析、数据可视化、机器学习有关知识和实例;也分享实用的资料教程、软件工具、学习文档和简历模板。发现求知的乐趣,在不断总结和学习中进步。坚持输出优质文章,期待你的关注,一起交流学习,互相成就。 发现求知的乐趣,在不断总结和学习中进步,与诸君共勉。