时间: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)

 

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐