维护简单ip池,selenium自动化,session和cookie

IP

网站为了防止被爬取,会有反爬机制,对于同一个IP地址的大量同类型的访问,会封锁IP,过一段时间后,才能继续访问,有几种简单的应对套路:

1.修改请求头,模拟浏览器(而不是代码去直接访问)去访问
2.采用代理IP并轮换
3.设置访问时间间隔
这是一个ip网站,https://www.xicidaili.com/`
使用代理格式
proxies的格式是一个字典proxies = {‘http’: ‘http://IP:port‘,‘https’:'https://IP:port‘}
把它直接传入requests的get方法中即可
web_data = requests.get(url, headers=headers, proxies=proxies)
ip的格式是HTTP(S)😕/xxx.xxx.xxx.xxx:xxxx

用requests+bs4爬取ip
在这里插入图片描述

可以看出访问百度大多数ip还是无效的,可以用条件语句选择有效ip用于其他页面的提取工作

检验ip有效性
在这里插入图片描述
使用ip列表

selenium

selenium是很好的应对反爬的工具,就是有点慢
在这里插入图片描述

自动化爬虫是驱动浏览器进行元素提取工作,通常用
在这里插入图片描述
selenium基本设置
接下来是基本的查找元素:
多种定位方式,顾名思义
试着往搜索框输入信息并回车
在这里插入图片描述
报错报错的原因在于 回车 之后,element没有定位在新的页面里

等待页面加载。应用场景:含有ajax加载的page!因为在这种情况下,页面内的某个节点并不是在一开始就出现了,而在这种情况下,就不能“查找元素”,元素选择不到,就不好进行交互操作!等待页面加载这两个模块经常是一起导入的:
显式等待,until后是条件
driver.implicitly_wait(10)隐式等待
模拟键盘操作
还有两点:
1.driver.switch_to.frame
很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug或者chrome检查也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼。

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

selenium提供了switch_to.frame()方法来切换frameswitch_to.frame(reference)
reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement。

从frame中切回主文档(switch_to.default_content())
切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档,driver.switch_to.default_content()。

ps:有时候我们会遇到嵌套的frame,这个时候要一层层切进去,
出来则是driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果。

2.driver.current_window_handle问题
selenium执行时并不会自动切换到新开的页签或者窗口上,mock browser还会停留在之前的窗口中。所以必须在新开窗口后通过脚本来进行窗口切换,才能正确操作相应窗口中的元素,例如:
handles = driver.window_handles # 获取当前窗口句柄集合(列表类型)
driver.switch_to.window(handles[num]) # 跳转到第num个窗口,从0开始
在这里插入图片描述

实例:接下来展示两个selenium动态爬虫实例,一个是爬取网易云音乐评论
Ajax信息
观察所有评论页的Ajax,就会发现,每一页Ajax的Data Form没有规律,看看其中的encSecKey这个字段,你就会发现,嗷,这玩意加密了。如果你擅长JavaScript,当然可以通过看懂他们的代码,然后解密。现在可以试试用selenium破解反爬。
下面是comment信息
在这里插入图片描述
再加入一个index(记录评论序号)和点击下一页,爬取10页的评论
‘夏天的风’4-13页的评论
在这里插入图片描述
不得不感慨selenium无比强大。我昨晚用selenium爬取了一个动态页面的数据库(前段时间没有爬出来),这个数据库如果分析js和一些加密参数,难度就很高了;当再学一些各种验证码的处理方式,你的selenium就非常牛了。但是,以后涉及scrapy的分布式爬虫,为了效率,还是得啃下来加密参数分析这一关。验证码处理和加密数据分析我以后也会分享!

session和cookie

静态网页: https://desmonday.github.io/,就是静态网页的代表,这种网页的内容是通过纯粹的 HTML 代码来书写,包括一些资源文件:图片、视频等内容的引入都是使用 HTML 标签来完成的。它的好处当然是加载速度快,编写简单,访问的时候对 web 容器基本上不会产生什么压力。但是缺点也很明显,可维护性比较差。
动态网页: 大家常用的某宝、某东、拼夕夕等网站都是由动态网页组成的。动态网页可以解析 URL 中的参数,或者是关联数据库中的数据,显示不同的网页内容。现在各位同学访问的网站大多数都是动态网站,它们不再简简单单是由 HTML 堆砌而成,可能是由 JSP 、 PHP 等语言编写的,当然,现在很多由前端框架编写而成的网页小编这里也归属为动态网页。比如使用频率最高的一个功能登录,像各种电商类网站,肯定是登录了以后才能下单买东西。那么,问题来了,后面的服务端是如何知道当前一个id已经登录了呢?
cookie用处
在这里插入图片描述
返回的响应头
cookie短期内有效,能够模拟登录状态,但是长期不行

打开淘宝,登录后看看cookie
在这里插入图片描述
cookie有关信息
那么有的网站为什么这次关闭了,下次打开的时候还是登录状态呢?
这就要说到 Cookie 的持久化了,其实也不能说是持久化,就是 Cookie 失效的时间设置的长一点,比如直接设置到 2099 年失效,这样,在浏览器关闭后,这个 Cookie 是会保存在我们的硬盘中的,下次打开浏览器,会再从我们的硬盘中将这个 Cookie 读取出来,用来维持用户的会话状态。
第二个问题产生了,服务端的会话也会无限的维持下去么,当然不会,这就要在 Cookie 和 Session 上做文章了, Cookie 中可以使用加密的方式将用户名记录下来,在下次将 Cookies 读取出来由请求发送到服务端后,服务端悄悄的自己创建一个用户已经登录的会话,这样我们在客户端看起来就好像这个登录会话是一直保持的。

最后用selenium做一个小项目,模拟登录丁香园,并抓取论坛页面所有的人员基本信息与回复帖子内容。丁香园论坛:http://www.dxy.cn/bbs/thread/626626#626626 。
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值