基于selenium的爬虫
~~~~~~~~~~ 爬虫在路上~~~~~~
该爬虫用来实现指定关键词 以及特定时间区间的搜狗微信搜索_订阅号及文章内容的爬取.如果没有记错的话,未登录情况下,只能翻10页
,想要更多,则需要基于selenium
利用cookies
实现模拟登录.
声明:本程序仅用于学习交流,请勿恶意使用!!!
文章目录
- 完整程序
- 爬虫(类)的详细介绍
- 1. 利用`Cookies`实现免密登录
- 2. 页面解析,及信息提取
- 3. 实现翻页
- 4. 数据的存储问题
- 5. 页面响应以及睡眠问题
- 6.建议
完整程序
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 7 13:21:00 2019@author: Administrator
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
import json
import time
import requests
import os.path
import randomclass WXspider:def __init__(self):passdef SearchKeywords(self,driver,searchName,dateStart,dateEnd):"""利用Cokies实现免密登陆"""url="https://weixin.sogou.com"#Cookies0=json.load(open(r'C:\Users\Administrator\Desktop\spider_data\0.json','r'))Cookies1 = json.load(open(r'C:\Users\Administrator\Desktop\spider_data\cookies\1.json', 'r'))#Cookies2 = json.load(open(r'C:\Users\Administrator\Desktop\spider_data\2.json', 'r'))driver.get(url)time.sleep(3)WebDriverWait(driver,20).until(EC.presence_of_element_located((By.CSS_SELECTOR,"div[class='searchbox'] a[class='logo']")))#Cookies=random.choice([Cookies0,Cookies1,Cookies2])driver.delete_all_cookies()time.sleep(5)for cookie in Cookies1:driver.add_cookie(cookie)driver.get(url)if driver.find_element_by_css_selector('div[class="login-info"] a[class="yh"]'):print("登陆成功".center(100,'*'))else:print("利用Cookies免密登陆失败")#开始输入关键字input=driver.find_element_by_css_selector("div[class='qborder2'] input[class='query']")input.clear()input.send_keys(searchName)input.send_keys(Keys.ENTER)time.sleep(10)##按照时间进行筛选searchBtn=driver.find_element_by_css_selector("div[id='tool_show']").click()time.sleep(1)driver.find_element_by_class_name('btn-time').click()#输入时间input2=driver.find_element_by_id('date_start')input2.clear()input2.send_keys(dateStart)input3=driver.find_element_by_id('date_end')input3.clear()input3.send_keys(dateEnd)#确认driver.find_element_by_class_name('enter')for i in range(5):driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')ActionChains(driver).key_down(Keys.DOWN).perform()time.sleep(3)return driver.page_sourcedef NextPage(self,driver):"""开始翻页"""nextPage=driver.find_element_by_link_text("下一页")nextPageText=nextPage.text#nextPage=driver.find_element_by_css_selector("div[class='p-fy'] a[last()]")curPage=driver.find_element_by_css_selector('div[id="pagebar_container"] span').text#print("当前是第{:-^30.0f}页,正在尝试翻页!".format(int(curPage)+1))try:if nextPageText:nextPage.click()driver.refresh()time.sleep(10)for i in range(8):driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')ActionChains(driver).key_down(Keys.DOWN).perform()time.sleep(3)except:passprint("翻页出现异常")finally:return nextPageText,driver.page_source,curPagedef GetParseHtml(self,link):user_agent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3650.400 QQBrowser/10.4.3341.400"headers={"User-agent":user_agent}r=requests.get(link,headers=headers,timeout=30)if r.status_code==200:r.encoding='utf-8'soup=BeautifulSoup(r.text,'lxml')content=""for i in soup.select('div[id="js_content"]'):content+=i.text.strip()print('链接采集完成'.center(50,'*'))return contentelse:print('该链接有问题,当前采集失败,暂时跳过')passdef GetContent(self,pageSource):soup=BeautifulSoup(pageSource,'lxml')filename=soup.title.string.split(" – ")[0]domain=os.path.abspath(r"C:\Users\Administrator\Desktop\长春长生")#存放路径filepath=os.path.join(domain,(filename+".json"))for i in soup.select("div[class='news-box'] ul[class='news-list'] li"):try:newsInfo={}newsInfo['title']=i.find('h3').text.strip()newsInfo['time']=i.select("span[class='s2']")[0].text.split(')')[-1]if i.select('div[class="txt-box"] h3 a'):tempLink=i.select('div[class="txt-box"] h3 a')[0].attrs['data-share']#开始解析网页content=self.GetParseHtml(tempLink)time.sleep(3)if content:#print(content)newsInfo['Content']=contentwith open(filepath,'a',encoding='utf-8') as f:json.dump(newsInfo,fp=f,ensure_ascii=False)f.close()except:passreturn print("当前页采集完成".center(25,'*'))def WeiXinSpider(self,searchname):driver=webdriver.Firefox()driver.set_page_load_timeout(100)driver.maximize_window()driver.implicitly_wait(30)print("开始微信文章的爬取!!!".center(50,'*'))self.SearchKeywords(driver,searchname)self.GetContent(driver.page_source)page=0try:while page<100:nextPage_sign,pageSource,curPage = self.NextPage(driver) # 判断"下一页"标志是否存在print("开始当前页--->>>{}<<<---采集".format(int(curPage) + 1))time.sleep(3)self.GetContent(pageSource)page+=1if nextPage_sign:passelse:breakexcept:print('已经是最后一页'.center(50,'*'))passfinally:driver.close()print('本次爬取任务完成'.center(50,'*'))if __name__=="__main__":spider=WXspider()spider.WeiXinSpider("长春长生疫苗",dateStart='2018-07-14',dateEnd='2018-07-16')
爬虫(类)的详细介绍
程序是我在未完整学习类时所写,感觉写的太罗嗦.这一点请忽略,重在理解爬虫过程:
1. 利用Cookies
实现免密登录
def SearchKeywords(self,driver,searchName,dateStart,dateEnd):
其中:searchName
为检索的目标关键词
,dateStart,dateEnd
表示目标时间区段
.
(1) 利用Cookies
模拟登录.
面向的是搜狗微信,所以需要利用Cookies
实现模拟登录.虽然这个获取途经有点猥琐,但是对于新手,绝对实用.就是一步一步模拟登录,然后用driver.get_cookies()
保存当前登录用户的Cookies
.基于selenium
一步模拟操作到位获取Cookies
,对我来说困难啊,关键时刻还得
"扫一扫,然后手动!手动!手动!!!"(自己体会)
程序中使用Cookies1 = json.load()
用来加载本地(保存)的Cookies
.这里建议多收集几组.网站好像识别能力提高了,容易被封IP.
(2) 输入检索关键词
,以及时间区段
(有点尴尬,时间段输入框好像不见了)
浏览器的基本设置参数
driver=webdriver.Firefox()
driver.set_page_load_timeout(100)
driver.maximize_window()
driver.implicitly_wait(30)
2. 页面解析,及信息提取
def GetParseHtml(self,link):
先获取一级新闻网址链接,然后使用requests.get
访问详情页.然后使用BeautifulSoup
.
相关信息提取技术可以参考爬虫:网页信息提取_Python_qq_40584718的博客-CSDN博客
3. 实现翻页
def NextPage(self,driver)
用来实现翻页
常用的方式有以下几种:
(1)有明显的翻页标志,如下一页
,则可以通过:
nextPage=driver.find_element_by_link_text("下一页")
或者:
nextPage=driver.find_element_by_id("下一页所对应的"id标签)
上述两种,适用范围不如通过xpath
和css
逐级定位.xpath,css使用语法
对应在selenium
中的语法格式为:
driver.find_element_by_css_selector()
driver.find_element_by_xpath()
翻页终止条件:
(1) 在一定范围内抓取固定页,这种比较简单;
(2) 有的网页遍历到最后一页时,下一页
这个标签在源码中会找不到,可以通过定位翻页标注(常与while搭配使用)
确定是否是最后一页!
4. 数据的存储问题
两种策略:
1.按照特定单位进行抓取与存储
;
本文是一次翻页中作为基本单位.这种需要将抓取的文件保存在统一文件夹,然后使用os库
来批量导入,合并数据.这种方法对异常情况的响应友好性要好于第二种策略.
2.者全部抓完一次存储
这种情况对程序的完整性要求较高,需要注意异常情况捕获,和处理.一次性存储可以使用json.dump
或者pandas
和numpy
的数据存储功能.
5. 页面响应以及睡眠问题
在抓取的过程中,要注意适当的睡眠,保证页面及时完整加载.
下面的程序用来实现常见的页面滚动操作
,导入文件from selenium.webdriver import ActionChains
.
for i in range(8):driver.execute_script('window.scrollTo(0,"document.body.scrollHeight")')ActionChains(driver).key_down(Keys.DOWN).perform()time.sleep(3)
通过一级链接访问详情页时需要注意详情页是打开了新窗口,还是覆盖了本地窗口
,这将会
涉及到网页的重定向问题
.这两个细节需要谨慎处理.
6.建议
静态网页,用requests或urllib库
完全够用;要是动态网页,再考虑使用selenium
.
基于selenium的爬虫相关推荐
- python selenium爬虫_详解基于python +Selenium的爬虫
详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...
- 爬虫系列(2):暴力爬虫——基于selenium和xpath定位方法爬取某个话题下的微博内容
为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...
- 基于selenium模拟浏览器爬虫JS-frame,搜索+爬取详情页+翻页
基于selenium模拟浏览器爬虫JS-frame网站 课设中需要爬一个很神奇的网站Web Gallery,一开始看结构以为是很简单的那种,开始爬的时候才发现它的结构之奇葩--所有东西都集成在一个ht ...
- 基于selenium+scrapy爬取复仇者联盟4豆瓣影评数据
基于selenium+scrapy爬取复仇者联盟4豆瓣影评数据 参考资料: 黑马程序员爬虫教程 静觅爬虫教程 mac下anaconda安装selenium+PhantomJS scrapy下载中间件结 ...
- 网络爬虫之Selenium(可视化)爬虫
前言:今天跟大家分享网络(selenium)爬虫,网络爬虫技术的用处范围非常广泛以及非常强大的一门技术.介绍爬虫之后,跟大家延伸Python这一门技术,因为讲到爬虫,就会联想到Python,自己也会讲 ...
- 基于selenium和xpath定位方法爬取某个话题下的微博内容!是真的强!
为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...
- selenium+python爬虫全流程教程
python+selenium爬虫全流程详解 selenium+python爬虫简介 selenium测试脚本 python+selenium 模拟浏览器----以chrome为例 浏览器驱动安装 浏 ...
- 【基于Selenium的发票查验-部署笔记】
基于Selenium的发票查验 前言 目录结构 验证码部分 部署笔记 1.Centos7将Python3.6升级至Python3.9 2.Centos7配置Chrome+Chromedriver环境 ...
- 基于python的界面自动化测试-基于Selenium+Python的web自动化测试框架
一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...
最新文章
- ui曲线谁是横坐标_vue项目引入echarts折线图 横坐标显示问题
- SAP WM 采购订单收货后LT06上架界面弹出的QM Sample小窗口如何不让其出现?
- Servlet的Cookie值保存与获取
- python语言需要英语非常好吗-Python用不好英语水平不够?这里有官方中文文档你看不看...
- ArcGIS for qml - 地址地标转换为经纬度(地理编码)
- Qt Creator使用灯光
- DockPanel 类
- Android官方开发文档Training系列课程中文版:分享文件之分享一个文件
- [转]进程间通信 - ipcrm
- insert select 过滤掉重复数据
- d-s证据理论 matlab 完整代码
- php 每七天执行代码,十天学会PHP之第七天
- GTD工具 Wunderlist使用心得总结
- 使用matplotlib动态打印图片(RGB图片)
- u盘安全弹出有什么用?数据丢失还能恢复吗
- git pull git push 报spawn ssh错误,vscode更换默认终端
- Laravel学习记录--查询构造器
- python热力图参数_python3.5数据处理——百度地图热力图传值
- 如何去除图片上的文字(PS使用教程)
- 【BZOJ5077】【UOJ198】【CTSC2016】时空旅行
热门文章
- 腾讯音乐计划以介绍形式在港交所主板二次上市
- 华为nova9 SE官网上架:华为首款1亿像素手机
- 台积电CEO魏哲家:3nm工艺按计划推进 明年一季度将看到营收
- 微信加入新功能,60秒语音不必从头听到尾,网友:还需要进度条
- 助农两年销量千万 “李佳琦公益”实现“造血式”帮扶
- 消息称阿里腾讯考虑互相开放生态系统 淘宝能用微信支付了?
- 李想:欣赏特斯拉 但更喜欢苹果、乔布斯
- 小米11渲染图曝光:屏下摄像头技术现身还有方形5摄相机模组
- 故宫也在拼多多卖货!故宫文具将入驻拼多多开设旗舰店!
- 交钱赎“人”!B站500万粉UP主被黑客勒索,腾讯都表示无解