整体思路
使用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)