右键查看网页源代码,提取出来二级页面的地址,拼接url,发请求,即使xpath写的在正确,可能获取的也是空列表。导致上述原因是因为一种反扒机制:js修改url。
再点击网页时触发js,js利用跳转或者修改技术使网页中显示出来的url并不是真正的url,没有获取到正确的url不可能进入二级页面提取内容
分析问题:
造成这一切的原因是因为js的原因,所以想获取到正确的url只能解析js代码,从js代码中获取到有用信息。点击fake_url会向服务器端发请求,返回的一定不是正确的目标代码,很大的可能性是执行的js代码块,只要拿到js代码块就可以解析。
解决问题:
- 在一级页面中提取出fake_url
- 向fake_url发请求,将此时获取到的hmtl先打印输出到控制台,分析js代码,看是由跳转重定向还是重新拼接修改原url导致的。
- 解析后按照js代码的思路破解出真正的url,向url发请求一定并结合正确的xpath或正则表达式一定能获得正确的目标内容。
总结一下目前的常见反扒机制:
- 检查请求头,大概率会检查的是
**User-Agent**
应对措施:利用自己封装的useragent列表每次随机抽取一个或者利用第三方库:fake_useragent随机获取一个useragent来防止useragent没有或者单独一个useragent访问超频。
- 动态加载网页
应对措施:动态加载网页只是无法在查看网页源代码选项中查看到目标信息,虽然数据js动态加载,但是最后获取到的数据一定会通过前后端交互的数据包,数据包一定可以在chrom控制端抓取到,一般选择异步加载的XHR,这里会找到目标加载数据。
- post请求
应对措施:post请求通常在发送的data数据里设坑,来阻挡爬虫的访问,一般数据一定会进行加密处理,通常为32为的md5加密或13位的时间戳,具体的加密方式需要分析具体的js源代码,通过解析js代码理解加密逻辑,才能在python中模拟加密逻辑成功封包发送请求获取响应,注意分析有一些数据是不变的,不需要解密加密处理。
代理ip池很有必要准备,随时准备ip被封,随机抽取ip进行发送请求。
总结:如果网页是动态加载的,js触发重定向一定是向其他的url地址进行的数据交互,要找到其他的url只有通过控制台抓包,这时抓到的是真实的数据交互地址,即使为动态加载的,该url地址也一定有规律。
抓取到的数据进行res.json()
可以直接获取到列表或者字典(python里的数据类型),text得到的是字符串。
但是仅仅适用于相应内容是json格式才行,否则无法解析为python的数据格式。