写在开头
大部分的网站都是没有任何反爬措施的, 直接爬取即可获取数据.
部分网站会有一些反爬措施, 常见的反爬翻来覆去也就那几种.
对于一些较难的爬取的网站, 根据实际需求及预算来估算一下是否需要爬取.
包括但不局限于 IP
, js加密
, 验证码
等
所见非所得
大部分的网站都是所见即所得的, 但一些网站的页面内容是使用js来进行渲染的, 直接抓取的数据和看到的不太一样. 不一样的方式大致分为两种: 同步加载
和异步加载
.
同步加载
http://xxgk.dingnan.gov.cn/bmgkxx/hbj/gzdt/gggs/index.htm
需求是获取表格中的数据 信息索取号
类 别
信息名称
生成日期
公开方式
公开时限
可以看到, 里面是有一个a标签的, 查看源网页, 发现并没有这个a标签
通过爬虫获取的数据也是没有这个a标签的, 这时候就需要对script
标签中的文本内容进行解析了, 通过,
来进行分割获取信息
上面说的只是其中的一种, 其它的和这种类似, 较老的网站最容易遇到这种情况了.
当定位不到元素时, 就需要查看一下网页源代码了
异步加载
http://hbj.jxfz.gov.cn/col/col4374/index.html?uid=14940&pageNum=1
异步加载也有get
和post
, 相对来说, 一般是get
简单
这个网页里面的内容是通过post
来请求的, 返回的数据也是需要进行简单处理的
https://www.w3school.com.cn/xml/xml_cdata.asp
返回的数据包含在注释中, 需要先把注释取消掉, 再进行信息的提取
res = response.text.replace('', '')
data_xml = Selector(text=res)
datas = data_xml.xpath("//record")
遇到带有类似csrf_token
的值时, 需要先获取这些隐藏输入框的值, 在进行post
请求
参考网址 http://www.pxedz.gov.cn/info/index.aspx?t=34
调试这个网站时浏览器可能会卡死
inputs = response.xpath('//form[@id="aspnetForm"]//input[@type="hidden"]')
for input_ in inputs:
name = input_.xpath('./@name').get()
value = input_.xpath('./@value').get()
self.datas.update({name: value})