项目介绍
公众号是我比较喜欢的一个学习途径,经常关注一些技术文章,进行实操训练一下,因此,打算来做一期爬取公众号的文章。
这里我们采用的是selenium库来通过搜狗微信网址来获取相关的文章内容:
搜狗微信网址
https://weixin.sogou.com/
页面详情
我们发现进入页面有一个登陆的按钮,如果我们不进行登陆的话,我们只能查看10个页面的内容,如果内容多的话,10页是完全不够的。
这里我设置了一个20秒休眠时间,进行微信扫码登录;然后再进行后续的操作。
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
接着就是输入我们想要的内容进行搜索相关文章
我用的是显示等待,超过10秒没有找到对应的内容,则说明其不存在。
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys("python") #模拟输入
driver.find_element_by_xpath("//input[@class='swz']").click()#模拟点击
最后就是爬取对应的文章了,我们在爬的时候要针对性的爬取,我这里选择的是公众号名称包含Python字眼的账号,如果找到则进行爬取保存。
#爬取页面所有文章
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if "python" in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
完整代码
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
from selenium.common.exceptions import TimeoutException
import xlwt
class official_accounts:
# #实例化参数,直接传入参数
# def __init__(self,name,deep_num):
# self.name = name
# self.deep_num = deep_num
#登录页面
def login_btn(self,name):
global driver
driver = webdriver.Firefox()
driver.get('https://weixin.sogou.com/')
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys(name)
driver.find_element_by_xpath("//input[@class='swz']").click()
#爬取内容
def get_news(self,name):
global data_total
data = []
time.sleep(1)
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if name in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
#获取文章发表日期
date = new.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')
#获取文章简介
content = new.find_elements_by_xpath("div[2]/p")[0].text
#获取链接
url = new.find_elements_by_xpath("div[2]/h3/a")[0].get_attribute('href')
data.append(title)
data.append(date)
data.append(content)
data.append(url)
if data not in data_total:
data_total.append(data)
print(sourse,title,date,content)
print(url)
print('------'*10)
else:
continue
#写入Excel中
def save(self,data_total,name): #将爬取的信息写入Excel文件
# xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩
con = xlwt.Workbook(encoding='utf-8',style_compression=0)
# 添加sheet表格,并允许重复修改
sheet = con.add_sheet("公众号文字爬取信息",cell_overwrite_ok=True)
colunm = ("title","date","content","url") #定义列名
for i in range(0,4):
sheet.write(0,i,colunm[i])
for i in range(0,len(data_total)-1):
d = data_total[i]
for j in range(0,4):
sheet.write(i+1,j,d[j])
con.save( name +".xls")
print("数据保存成功!")
#定义爬取深度,要爬取多少个页面后就停止
def depth(self,name,deep_num):
self.login_btn(name)
global data_total
data_total = []
self.get_news(name)
d = 1 #定义一个爬取深度,爬取多少个页面
while d < deep_num:
try:
btn = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'sogou_next')))
btn.click()
self.get_news(name)
d = d+1
except TimeoutException:
break
self.save(data_total,name)
OA = official_accounts()
name = 'Python'
deep_num = 25
OA.depth(name,deep_num)
driver.close()