爬虫提高之selenum的学习

爬虫提高
介绍
在前面我们我们学习了如何发送请求和提取数据,学习完入门的课程之后,我们应该能够处理目前接触到的70%的网站数据的抓取。

但是可能我们会发现一些问题,比如:数据是通过js渲染出来的,数据的存储不方便,数据抓取的效率太低,那么通过本部分爬虫提高的内容的学习之后,就能够解决对应的这些问题

目标
掌握selenium的使用
掌握mongodb数据库的使用
掌握scrapy框架的使用
掌握scrapy_redis框架的的使用

2.1selenium
介绍
在本小结我们会开始系统的了解常见的反爬措施和解决思路,通过在学习selenium模块,它能够帮助我们控制浏览器,能够起到很大程度的反反爬的效果

内容
2.1.1常见的反爬措施和结局思路
selenium的使用
打码平台的使用

常见的反爬手段和解决思路
目标
了解常用的反爬手段和解决思路

  1. 明确反反爬的主要思路
    反反爬的主要思路就是:尽可能的去模拟浏览器,浏览器在如何操作,代码中就如何去实现。浏览器先请求了地址url1,保留了cookie在本地,之后请求地址url2,带上了之前的cookie,代码中也可以这样去实现。

很多时候,爬虫中携带的headers字段,cookie字段,url参数,post的参数很多,不清楚哪些有用,哪些没用的情况下,只能够去尝试,因为每个网站都是不相同的。当然在盲目尝试之前,可以参考别人的思路,我们自己也应该有一套尝试的流程。

2.通过headers字段来反爬
2.1 通过headers中的User-Agent字段来反爬
通过User-Agent字段反爬的话,只需要给他在请求之前添加User-Agent即可,更好的方式是使用User-Agent池来解决,我们可以考虑收集一堆User-Agent的方式,或者是随机生成User-Agent

import random

def get_ua():
    first_num = random.randint(55, 62)
    third_num = random.randint(0, 3200)
    fourth_num = random.randint(0, 140)
    os_type = [
        '(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)',
        '(Macintosh; Intel Mac OS X 10_12_6)'
    ]
    chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)

    ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36',
                   '(KHTML, like Gecko)', chrome_version, 'Safari/537.36']
                  )
    return ua

2.2 通过referer字段或者是其他字段来反爬
例如豆瓣电视剧中,通过referer字段来反爬,我们只需要添加上即可

2.3 通过cookie来反爬
如果目标网站不需要登录 每次请求带上前一次返回的cookie,比如requests模块的session

如果目标网站需要登录 准备多个账号,通过一个程序获取账号对应的cookie,组成cookie池,其他程序使用这些cookie

3.通过js来反爬
3.1 通过js实现跳转来反爬
在请求目标网站的时候,我们看到的似乎就请求了一个网站,然而实际上在成功请求目标网站之前,中间可能有通过js实现的跳转,我们肉眼不可见,这个时候可以通过点击perserve log按钮实现观察页面跳转情况

在这些请求中,如果请求数量很多,一般来讲,只有那些response中带cookie字段的请求是有用的,意味着通过这个请求,对方服务器有设置cookie到本地

3.2 通过js生成了请求参数
对应的需要分析js,观察加密的实现过程

在下一小节,学习了selenium这个问题会变得很容易

3.3 通过js实现了数据的加密
对应的需要分析js,观察加密的实现过程 在下一小节,学习了selenium这个问题会变得很容易

  1. 通过验证码来反爬
    通过打码平台或者是机器学习的方法识别验证码,其中打码平台廉价易用,更值得推荐,后面的课程回来学习如何使用

  2. 通过ip地址来反爬
    同一个ip大量请求了对方服务器,有更大的可能性会被识别为爬虫,对应的通过购买高质量的ip的方式能够结局问题

  3. 其他的反爬方式
    6.1 通过自定义字体来反爬
    下图来自猫眼电影电脑版

解决思路:切换到手机版

6.2 通过css来反爬
下图来自猫眼去哪儿电脑版

解决思路:计算css的偏移

小结
本小结重点
能够列举常见的反爬手段
了解对应的反反爬措施

2.1.2selenium的使用
目标
了解selenium和phantomjs以及chromedriver是什么以及如何安装
掌握selenium的控制浏览器的方法
掌握selenium获取元素中数据的方法

  1. 什么是selenium
    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏

  2. PhantomJS的介绍
    PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript

下载地址:http://phantomjs.org/download.html
3. Chromedriver的介绍
Chromedriver 也是一个能够被selenium驱动的浏览器,但是和PhantomJS的区别在于它是有界面的

下载地址:https://npm.taobao.org/mirrors/chromedriver
4. driver的安装
最简单的安装方式是:解压后把bin目录下的可执行文件移动到环境变量下,比如/usr/bin 或者是/usr/local/bin下面

注意:Chromedriver和电脑上的chrome版本有对应关系,建议使用最新的Chromedriver版本并且更新chrome浏览器到最新版

  1. selenium的入门使用
    知识点:

掌握如何发送请求,加载网页
掌握如何进行简单的元素定位
掌握如何从获取浏览器中的数据
加载网页: selenium通过控制浏览器,所以对应的获取的数据都是elements中的内容

  from selenium import webdriver 
  driver = webdriver.PhantomJS(“c:…/pantomjs.exe”)
  driver.get("http://www.baidu.com/")
  driver.save_screenshot("长城.png")

定位和操作:

  driver.find_element_by_id(“kw”).send_keys(“长城”)
  driver.find_element_by_id("su").click()

查看请求信息:

  driver.page_source
  driver.get_cookies()
  driver.current_url

退出

  driver.close() #退出当前页面
  driver.quit()  #退出浏览器

6.练习
模拟登陆豆瓣网

  1. selenium的定位操作
    知识点:

掌握定位元素的方法
掌握获取元素中数据的方法
定位元素语法:

  find_element_by_id (返回一个元素)
  find_elements_by_xpath (返回一个包含元素的列表)
  find_elements_by_link_text (根据连接文本获取元素列表)
  find_elements_by_partial_link_text (根据连接包含的文本获取元素列表)
  find_elements_by_tag_name (根据标签名获取元素列表)
  find_elements_by_class_name (根据类名获取元素列表)

注意: find_element和find_elements的区别 by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本

使用:

以豆瓣首页为例:https://www.douban.com/

  from selenium import webdriver

  driver =webdriver.Chrome()

  driver.get("https://www.douban.com/")

  ret1 = driver.find_element_by_id("anony-nav")
  print(ret1)
  # 输出为:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>

  ret2 = driver.find_elements_by_id("anony-nav")
  print(ret2)
  #输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]

  ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a")
  print(len(ret3))
   #输出为:1

  ret4 = driver.find_elements_by_tag_name("h1")
  print(len(ret4))
   #输出为:1

  ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
  print(len(ret5))
   #输出为:1

  ret6 = driver.find_elements_by_partial_link_text("豆瓣")
  print(len(ret6))
   #输出为:28

  driver.close()

获取数据语法
find_element仅仅能够获取元素,不能顾直接获取其中的数据,find_element_by_xapth也是这样
获取文本:element.text
获取属性值:element.get_attribute(“href”)
使用示例:

from selenium import webdriver

driver =webdriver.Chrome()

driver.get("https://www.douban.com/")

ret4 = driver.find_elements_by_tag_name("h1")
print(ret4[0].text)
#输出:豆瓣

ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
print(ret5[0].get_attribute("href"))
#输出:https://www.douban.com/doubanapp/app?channel=nimingye

driver.close()
  1. selenium 处理cookie
    通过driver.get_cookies()能够获取所有的cookie

    把cookie转化为字典

    {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

    #删除一条cookie
    driver.delete_cookie(“CookieName”)

    删除所有的cookie

    driver.delete_all_cookies()

  2. 页面等待
    为什么需要等待

如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错

页面等待的方法 time.sleep(10)

9.动手
爬取斗鱼直播平台的所有房间信息:https://www.douyu.com/directory/all

思路分析:

数据的位置

每个房间的数据都在id=live-list-contentbox的ul中

实现翻页和控制程序结束

selenium中通过点击就可以实现翻页,观察存在下一页和不存在下一页时候标签的变化

存在下一页时:

不存在下一页时:

  1. 使用selenium切换frame
    frame是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是 driver.switch_to.frame()

动手:模拟登陆qq邮箱

在使用selenium登录qq邮箱的过程中,我们会发现,无法在邮箱的登录input标签中输入内容,通过观察源码可以发现,form表单在一个frame中,所以需要切换到frame中

  1. selenium的优缺点
    selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
    selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用
  2. 作业
    完成网易云音乐的所有分类下的所有的播放列表,包括:播放列表的标题和url地址

思路分析:

确定程序入口的位置 首先可以定位到所有的大分类和所有的小分类

获取所有的小分类的地址后,遍历请求获取播放列表页的首页

确定首页数据的位置和url地址

数据不是在url地址对应的响应中,而是在另一个url地址中,可以使用selenium,也可以使用requests来获取

实现翻页和程序停止的判断

存在下一页的情况:

不存在下一页的情况

地址:http://music.163.com/#/discover/playlist

小结
本小结重点
掌握selenium和driver的安装
掌握selenium操作浏览器的方法
掌握selenium定位页面数据的方法

2.1.3打码平台的使用
目标
了解常见的打码平台
掌握如果通过打码平台处理验证码

  1. 为什么需要了解打码平台的使用
    现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台爬虫中的验证码

  2. 常见的打码平台
    云打码:http://www.yundama.com/

能够解决通用的验证码识别

极验验证码智能识别辅助:http://jiyandoc.c2567.com/

能够解决复杂验证码的识别

  1. 云打码的使用
    下面代码是云打码平台提供,做了个简单修改,只用传入response.content 即可识别图片

代码内容请点击

4.常见的验证码的种类
4.1 url地址不变,验证码不变
这是验证码里面非常简单的一种类型,对应的只需要获取验证码的地址,然后请求,通过打码平台识别即可

4.2 url地址不变,验证码变化
这种验证码的类型是更加常见的一种类型,对于这种验证码,大家需要思考:

在登录的过程中,假设我输入的验证码是对的,对方服务器是如何判断当前我输入的验证码是显示在我屏幕上的验证码,而不是其他的验证码呢?

在获取网页的时候,请求验证码,以及提交验证码的时候,对方服务器肯定通过了某种手段验证我之前获取的验证码和最后提交的验证码是同一个验证码,那这个手段是什么手段呢?

很明显,就是通过cookie来实现的,所以对应的,在请求页面,请求验证码,提交验证码的到时候需要保证cookie的一致性,对此可以使用requests.session来解决

小结
本小结重点
理解验证码的不同类型和不同处理方式
熟悉云打码的使用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值