UA检测与UA伪装
UA:User-Agent(请求载体的身份标识)
我们使用requess.get去请求网页就不再是以浏览器的身份去访问,而是以爬虫程序去访问,门户网站的服务器会检测对应请求的载体身份标识,如果检测到为某一款浏览器,这个请求会被当作正常用户请求。
但是,如果检测到不是基于浏览器访问,则被视为不正常请求!(爬虫),则服务器很有可能拒绝该请求!
所以我们一定要进行UA伪装!!! 伪装成某一款浏览器。
比较翻译前后的url:
它实际上是在你输入内容后进行局部页面刷新(不用你自己刷新)从而实现翻译。
从Content-Type可以看出响应数据的类型!
Post和Get的区别(使用不同函数)
实际上就是post是要携带用户信息的请求方式,get则是根据URL直接获取网页信息(即某个网址所包含的信息)。
post要获取的内容只靠网址是不能获取到的,需要提交一些额外的信息,这种信息在不同的网页中发挥不同功能。 例如在查询天气的网页,可能就是要输入城市信息;在登录某些网页时,又是账号和密码的载体。从这些可以看出get方法获取到的内容是稳定的(即每个人打开某个网页获得的信息相同),但是使用post需要输入特定信息,那么得到的网页内容就会有特异性。
post每次获取某个特定网页都需要输入额外信息,但get则直接输入URL即可(),这样也能看出post方法更加安全,因为额外信息不会直接暴露在网址上。
(百度翻译是post,因为需要我们向它传递dog这个数据,它才会返回值)
在翻译dog的基础上,我们同样可以将dog设置成一个参数,通过我们传入的参数不同以达到获取不同单词的翻译结果。
动态化获取:
进入这个网址:豆瓣
当滑动滚轮时,滑到底部的时候页面会进行刷新使得右边的滑块又跑到了中央,所以我们可以利用这次刷新进行数据收集。
我们也可以通过下图来获取具体的参数,直接复制到字典中存储即可。
(之后就是进一步的数据处理)
动态加载
验证后发现,它并不是直接通过html实现数据的显示,可能是ajax实现,再进行验证。
但我们需要的是每一家企业的详情页中的所有信息,该如何处理呢?
域名和id值进行拼接,拼接出一个完整的企业对应的详情页url。
注意:如果是post型,一定要记得传入参数!否则什么都得不到,因为post需要你向服务器提供数据,它才会返回相关的数据给你!
我们先对具体的详情页面进行试验,发现可以进行爬取:
接下来的任务就是将首页中获取的id与详情页面的url联系在一起,从而实现详情页的爬取:
数据解析原理:使用数据解析,是因为有一些数据存在于标签之间或者在标签对应的属性值中。我们需要定位到具体标签的位置,或是标签相应的属性的位置,再获取标签中相关的数据。
大致有三类:
1、正则(适用于多种语言)
2、bs4(仅适用于Python)
3、xpath(重要)
编码流程变为:
1、指定url
2、发起请求
3、获取相应数据
4、数据解析
5、持久化存储
步骤如下:先获取一整个页面,再对这个页面进行解析,获取其中的图片。
soup提供的用于数据解析的函数
1、soup.tagName(自己输入)
2、soup.find()
1)soup.find(‘div’)等同于soup.div
2)属性定位(根据具体属性定位到对应属性的标签)
soup.find(‘div’,class_/id/attr=‘song’)(这里class要加下划线,不然会被当作关键字)
3、soup.find_all()
find_all会返回符合要求的所有标签,用法同soup.find()
4、soup.select()
需要传入某种选择器(id、类、标签选择器),返回是一个列表
class选择器:
标签选择器:
id选择器:
层级选择器:
(大于号表示一个层级,也可以将大于号替换为空格,代表之间有多个层级)
soup.select(’.tang > ul > li > a’):查找.tang类下的ul标签下的li标签下的a标签
获取标签中的文本数据
之前是定位到具体的标签,现在是利用定位到的具体标签来提取其中的数据。
soup.a.text/string/get_text(),用于读取文本数据
text/get_text():可以获取一个标签中的所有文本内容
string:只可以获取该标签下面直系的文本内容
我们上面想要的src不属于文本数据!
获取标签中属性值
直接使用 [ 属性名 ]
我们成功从中提取到了src!!!
最常用且最便捷高效的一种新方法,通用性。
xpath解析原理:
1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
2、调用etree对象中的xpath方法,结合着xpath表达式实现标签的定位和内容的捕获
如何实例化一个etree对象:from lxml import etree
1、将本地html文档重点源码数据加载到etree对象中:
etree.parse(filePath)
2、可以将从互联网上获取的源码加载到该对象中:
etree.HTML(‘page_text’)
xpath(‘xpath表达式’),返回一个列表!
/ 表示从根节点开始,一个 / 表示一个层级,而//表示多个层级,或者表示可以从任意位置开始定位。(所有)
属性定位:
tagName[@attrName=“attrValue”]
索引定位:
表示div标签下,类名为song下的p标签,可以在后面使用 [1] 索引,从1开始!!!
取文本:
取得,a标签下的文本内容。
/text(),获取的是标签中直系的文本内容
//text(),获取的是标签中非直系(所有的)文本内容
取属性:
/@属性名 (/@src,获取img标签下的src属性)
回顾一下,我们是怎么判断网页中的数据是否为动态加载:
可以发现,如果使用像上面的方法进行查找的话,会比较耗时,我们就需要使用selenium模块!
1、作用
1、它能帮助便捷的获取网站中动态加载的数据!
2、便捷地使用模拟登陆!
selenium是基于浏览器自动化的一个模块。(就是自动地使用浏览器的相关功能,让他自己去操纵浏览器,不用我们自己去弄)
2、使用流程
驱动程序和版本要对应。对照表
再把驱动放在你项目的文件夹中。
用代码操纵你的浏览器!
以药监局的例子为例:
1、先操纵浏览器打开药监局的网站:
2、获取浏览器当前页面的页面源码数据(公司名字)
3、其他自动化操作(以淘宝搜索为例)
如何向搜索框中传值呢?
如何实现页面滚轮下滑效果呢?
什么是iframe???
用于实现网页的嵌套。
如何定位的标签存在于iframe标签之中,直接寻找是寻找不到的!
实现在iframe下的定位:
模拟人操作鼠标,进行滑块的拖动:
现在不能直接登录,需要进行滑块验证!