python爬取搜狗微信指定关键词的全部内容

整体思路

使用webdriver登录并搜索,注意,页面的url并不是文章的真实url,需要使用webdriver进行跳转,同时注意切换窗口的handle

函数介绍

  • init()---------->用来初始化,即扫码登陆,有10秒暂停时间
  • get_one_page_data()------------->将某个html界面传进来进行解析,然后传出去
  • spyder()-------------------->开始爬虫,keyword是检索的关键词,from_page是从第几页开始,to_page是到第几页结束,不写默认是从第一页开始,到最后一页结束

遗留问题

  • 鄙人有一次测试显示handel列表超出索引,不知道咋回事,可能是系统性能慢?通常不会遇到的,因为代码逻辑没问题

程序代码

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import sys
import time
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd

def init():
    url = 'https://weixin.sogou.com'
    driver.get(url)
    driver.find_element_by_id('loginBtn').click()
    time.sleep(10)

def get_one_page_data(data):
    # print(data)
    soup = BeautifulSoup(data, 'lxml')  # 解析html
    title = soup.select("#activity-name")[0].get_text().strip()  # 标题名
    date = soup.select("#publish_time")[0].get_text().strip()  # 发文时间
    name = soup.select("#js_name")[0].get_text().strip()  # 发文公众号

    text = soup.select("#page-content")[0].get_text().split()  # 这个标签下的所有文本
    temp_dict = {len(i): i for i in text}  # 用来提取文章主要内容,通过len来得到
    text = temp_dict[max(temp_dict.keys())].strip()  # 提取主要内容

    # print((title, date, name, text))
    return {'title':title, 'date':date, 'name':name, 'text':text}

def spyder(keyword = '白菜行情',from_page = 0,to_page = sys.maxsize):
    for page in range(from_page-1,to_page):  # 为什么减1呢?因为page从0开始
        url = 'https://weixin.sogou.com/weixin?query='+keyword+'&s_from=input&_sug_=y&type=2&page='+str(page)+'&ie=utf8'
        driver.get(url)
        for i in range(10):
            try:  # 有的页面只有9条内容
                driver.find_element_by_xpath('//*[@id="sogou_vr_11002601_title_%s"]'%i).click()
            except:
                continue
            driver.switch_to.window(driver.window_handles[1])  # 切换handle
            # 有时候切换window_handles失败
            try:  # 显示等待:显示等待是表明某个条件成立后才执行获取元素的操作
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.ID, "activity-name"))
                )
            except:  # 有时候等不到,有时候返回的是视频页面
                driver.close()
                driver.switch_to.window(driver.window_handles[0])
                continue
            data = driver.page_source
            one_page_data = get_one_page_data(data)
            all_data.append(one_page_data)
            driver.close()
            driver.switch_to.window(driver.window_handles[0])  # 回到第一个handle
        try:  # 判断下一页这个button是否存在,如果不存在就是提前终止
            driver.find_element_by_id('sogou_next')
        except:
            break

if __name__ == '__main__':
    all_data = []
    key_word = '白菜行情'
    driver = webdriver.Firefox()
    # init()  # 用于用户登录
    spyder(key_word,1,4)

    df = pd.DataFrame(all_data)
    df.to_excel('%s-搜狗微信.xlsx'%key_word,index=False)
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值