时间:2021-1-18
目标:爬取广东能源商务网的招标项目列表
关键难点:asp.net脚本语言,requests库的post函数,xpath的解析,openpyxl的使用
1 - 什么是asp.net?
微软公司推出的新一代脚本语言。
ASP.NET具备开发网站应用程序的一切解决方案,包括验证、缓存、状态管理、调试和部署等全部功能。
也就是所谓的 .NET 开发
2 - 什么是aspx?
aspx文件是微软的在服务器端运行的动态网页文件,属于ASP.NET技术。
3 - 爬虫时遇到的相关问题
(1)对动态网页一无所知
以前没爬取过动态网页,一开始用爬知网的思路爬广东能源商务网, 自然是碰壁,只能得到第一个页面的内容。后来通过搜索动态网页类型了解到 asp.net,经过比对确认了广东能源商务网使用的是 aspx动态网页。
(2)确认了aspx网页后,不知道如何切换到第二个页面
了解到网页使用的是动态网页,自然是要向网页发出什么,然后接收回复信息,问题就是如何对动态网页发出请求并得到响应内容。经过搜索后确认了使用 requests 库里的 post() 函数提交表单。
post(url,data)
url:提交表单的对象
data:提交的内容
该函数会将提交完成后的网页内容返回的 Response对象。
(3)post()函数如何使用?尤其是data值如何找出来?
1、确认了使用post()函数接下来要研究怎么用。关键点是:data 是什么?
post要对网页提交信息,提交的信息储存在data里。接下来要了解 post() 的data参数格式,主要分为两种:json 和 dict。dict也就是字典,这个我比较熟悉,而且python没有内置json,还得导包。因此这里选择字典格式。
dict = {'a':'A','b':'B'}
2、字典格式要“键”对应“值”,但 data 里的键是什么?值是什么?
经过一阵查询之后我确认了方法:万能的开发人员工具(F12),在 Network 里看,找到对应的网页信息的 Headers,看到最后的 Form Data,就是所需要的 data 的内容,如下图:
__EVENTTAGET 为键,冒号后面的为值。
__EVENTAGUMENT 为键,冒号后面的为值。
通过爬虫,能够从第一个网页的代码中根据“键”得到“值”,然后组成一个 dict,接下来就能进行 post() 了
(4)中文乱码
request在 get() 和 post() 之后都会返回一个 Response 对象。这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。
其中返回的网页部分会存在 .content 和 .text 两个对象中。
一般情况下,.text() 能直接返回一个字符串,更方便,但因为解码问题会出现乱码。
这时候就要用到 .content() 返回一个bytes(字节码),接着用 decode() 进行编码,返回正确编码后的字符串。
a = html.content.decode('utf-8')
(5)网页证书问题
在 .get() 或者 .post() 中加入 verify = False,跳过SSL验证
r = requests.post(url=url, data=data, headers=headers, verify=False)