~~~~~~~~~~ 爬虫在路上~~~~~~


该爬虫用来实现指定关键词 以及特定时间区间的搜狗微信搜索_订阅号及文章内容的爬取.如果没有记错的话,未登录情况下,只能翻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标签)

上述两种,适用范围不如通过xpathcss逐级定位.xpath,css使用语法
对应在selenium中的语法格式为:

driver.find_element_by_css_selector()
driver.find_element_by_xpath()

翻页终止条件:
(1) 在一定范围内抓取固定页,这种比较简单;
(2) 有的网页遍历到最后一页时,下一页这个标签在源码中会找不到,可以通过定位翻页标注(常与while搭配使用)确定是否是最后一页!

4. 数据的存储问题

两种策略:
1.按照特定单位进行抓取与存储;
本文是一次翻页中作为基本单位.这种需要将抓取的文件保存在统一文件夹,然后使用os库来批量导入,合并数据.这种方法对异常情况的响应友好性要好于第二种策略.

2.者全部抓完一次存储
这种情况对程序的完整性要求较高,需要注意异常情况捕获,和处理.一次性存储可以使用json.dump或者pandasnumpy的数据存储功能.

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的爬虫相关推荐

  1. python selenium爬虫_详解基于python +Selenium的爬虫

    详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...

  2. 爬虫系列(2):暴力爬虫——基于selenium和xpath定位方法爬取某个话题下的微博内容

    为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...

  3. 基于selenium模拟浏览器爬虫JS-frame,搜索+爬取详情页+翻页

    基于selenium模拟浏览器爬虫JS-frame网站 课设中需要爬一个很神奇的网站Web Gallery,一开始看结构以为是很简单的那种,开始爬的时候才发现它的结构之奇葩--所有东西都集成在一个ht ...

  4. 基于selenium+scrapy爬取复仇者联盟4豆瓣影评数据

    基于selenium+scrapy爬取复仇者联盟4豆瓣影评数据 参考资料: 黑马程序员爬虫教程 静觅爬虫教程 mac下anaconda安装selenium+PhantomJS scrapy下载中间件结 ...

  5. 网络爬虫之Selenium(可视化)爬虫

    前言:今天跟大家分享网络(selenium)爬虫,网络爬虫技术的用处范围非常广泛以及非常强大的一门技术.介绍爬虫之后,跟大家延伸Python这一门技术,因为讲到爬虫,就会联想到Python,自己也会讲 ...

  6. 基于selenium和xpath定位方法爬取某个话题下的微博内容!是真的强!

    为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...

  7. selenium+python爬虫全流程教程

    python+selenium爬虫全流程详解 selenium+python爬虫简介 selenium测试脚本 python+selenium 模拟浏览器----以chrome为例 浏览器驱动安装 浏 ...

  8. 【基于Selenium的发票查验-部署笔记】

    基于Selenium的发票查验 前言 目录结构 验证码部分 部署笔记 1.Centos7将Python3.6升级至Python3.9 2.Centos7配置Chrome+Chromedriver环境 ...

  9. 基于python的界面自动化测试-基于Selenium+Python的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

最新文章

  1. ui曲线谁是横坐标_vue项目引入echarts折线图 横坐标显示问题
  2. SAP WM 采购订单收货后LT06上架界面弹出的QM Sample小窗口如何不让其出现?
  3. Servlet的Cookie值保存与获取
  4. python语言需要英语非常好吗-Python用不好英语水平不够?这里有官方中文文档你看不看...
  5. ArcGIS for qml - 地址地标转换为经纬度(地理编码)
  6. Qt Creator使用灯光
  7. DockPanel 类
  8. Android官方开发文档Training系列课程中文版:分享文件之分享一个文件
  9. [转]进程间通信 - ipcrm
  10. insert select 过滤掉重复数据
  11. d-s证据理论 matlab 完整代码
  12. php 每七天执行代码,十天学会PHP之第七天
  13. GTD工具 Wunderlist使用心得总结
  14. 使用matplotlib动态打印图片(RGB图片)
  15. u盘安全弹出有什么用?数据丢失还能恢复吗
  16. git pull git push 报spawn ssh错误,vscode更换默认终端
  17. Laravel学习记录--查询构造器
  18. python热力图参数_python3.5数据处理——百度地图热力图传值
  19. 如何去除图片上的文字(PS使用教程)
  20. 【BZOJ5077】【UOJ198】【CTSC2016】时空旅行

热门文章

  1. 腾讯音乐计划以介绍形式在港交所主板二次上市
  2. 华为nova9 SE官网上架:华为首款1亿像素手机
  3. 台积电CEO魏哲家:3nm工艺按计划推进 明年一季度将看到营收
  4. 微信加入新功能,60秒语音不必从头听到尾,网友:还需要进度条
  5. 助农两年销量千万 “李佳琦公益”实现“造血式”帮扶
  6. 消息称阿里腾讯考虑互相开放生态系统 淘宝能用微信支付了?
  7. 李想:欣赏特斯拉 但更喜欢苹果、乔布斯
  8. 小米11渲染图曝光:屏下摄像头技术现身还有方形5摄相机模组
  9. 故宫也在拼多多卖货!故宫文具将入驻拼多多开设旗舰店!
  10. 交钱赎“人”!B站500万粉UP主被黑客勒索,腾讯都表示无解