网站建设的功能/推广合作
想实现抓取某基金网站持仓信息的功能,
1. 开发者工具里 Sources和Elements tab下内容的区别?
Sources tab下显示的是静态网页的内容,通过AJAX等动态获取的数据,在sources下面是没有的。在Elements tab下是页面最终加载的所有内容的网页内容。
Elements的内容是网页经过浏览器渲染后得到的最后呈现效果,最主要的是包含了异步请求数据。
场景:使用网页的地址作为url时,发现用requests.get返回的是——sources里面的html文本,但我想要抓取的数据并没有。
遇到这种问题,是因为通过原始网页没有抓取到二次加载数据内容。
这说明这个要爬取的页面使用了ajax技术,一些数据是二次动态加载过来的。
Source里面,你没法看见用脚本动态添加或者删除的标签
Elements反映的是切实通过脚本“加工”过的页面,最终呈现的页面的元素
Elements 工具具备几个主要功能:选择元素、模拟器、代码区、样式区。用elements工具定位数据比直接从源代码中搜索要方便,因为可以通过DOM清楚的了解元素结构,不过Elements里看到的代码不等于请求网址拿到的返回值。
下文两个文章对异步请求的背景进行了介绍
《深入理解爬虫:网页分析||审查元素》https://blog.csdn.net/The_Time_Runner/article/details/110674326
《(20201201- 问题已解决)request爬虫beautifulsoup无法提取tbody》
https://blog.csdn.net/The_Time_Runner/article/details/110688093
获取二次加载的数据,需要使用network tab的抓包功能,Fetch/XHR子tab下查看二次加载数据的网页url等。
2.response.text和response.content和response.json()该如何使用?
原则:根据服务器返回数据的格式,要使用与之对应的解析response方式获取数据。
response.text
类型:str
response.text 返回的是Unicode格式的数据
解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
修改编码方式:response.encoding=“gbk”
使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。
response.content
类型:bytes
response.content返回的字节流数据
解码类型: 没有指定
修改编码方式:response.content.deocde(“utf8”), 可以不写默认就是utf-8
使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。
当收到一个响应时,Requests 会猜测响应的编码方式,用于在你调用response.text 方法时对响应进行解码。Requests 首先在 HTTP 头部检测是否存在指定的编码方式,如果不存在,则会使用 chardet.detect来尝试猜测编码方式(这样存在误差),所以更推荐使用response.content.deocde()
如果服务器返回content-type明确是json格式数据,则可以直接response.json()解析结果。
返回类型的背景知识
在response header,中,可以查看content-type内容,例如:
content-type: application/json;charset=utf-8
content-type: text/html; charset=utf-8
ajax开发中在请求server端的响应时, 对于每一种返回类型 规范的做法是要在服务端指定response的contentType 的. (当然 不指定绝大多数情况下也没什么问题 尤其是返回"非xml"的时候) 。
常遇到以下的几种情况:
1、 服务端须要返回一段普通文本给client,Content-Type=“text/plain”
2 、服务端须要返回一段HTML代码给client ,Content-Type=“text/html”
3 、服务端须要返回一段XML代码给client ,Content-Type=“text/xml”
4 、服务端须要返回一段javascript代码给client
5 、服务端须要返回一段json串给client
我们主要讨论返回javascript代码和Json对象的情况。
javascript 的 contentType 按最标准的写法 应该是 application/javascript。而经常使用的 text/javascript 已经被 rfc定义为废弃的。
可是 在这里临时不建议使用 application/javascript . 大家还是继续使用 text/javascript 为好. 由于非常多老旧浏览器并不支持 application/javascript . 而全部浏览器都支持text/javascript. 在标准和广泛的兼容性之间 还是暂且选择后者吧。
json 的 contentType 常见写法有 : text/json & text/javascript .
可是 这个 text/json 事实上是根本不存在的, 而 text/javascript 在有些时候client处理起来会有歧义. 对于json的contentType , rfc里定义的标准写法是 :application/json.
在这里毫无疑问 我们应该选择标准写法的 application/Json。
3.代理的使用
由于很多网站有反爬机制。当一个ip频繁访问时,有可能触发反爬机制。导致这个ip对网站的访问被封。这时候就需要使用代理机制,构造不同ip访问,避免爬取数据时被封。