爬取公众号文章

项目介绍

公众号是我比较喜欢的一个学习途径,经常关注一些技术文章,进行实操训练一下,因此,打算来做一期爬取公众号的文章。
这里我们采用的是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()

输出结果

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值