嘘~ 正在从服务器偷取页面 . . .

千里之行,始于足下。python 爬虫 requestes模块(6)


药监局爬取

是不是在看到 “ 药监局 ” 这三个字的时候,突然想到爬虫可能会进局子的事实? 说到局子,我突然想到另一件事,因为前面写的是很基础的代码,没有代理池,所以在写的时候,特别是爬取翻页的时候,尽量减少爬取的页数,不然,额,后果自负。

开个玩笑,没什么大问题的,就是很有可能自己的 IP 会被对面拉入黑名单(目前学的代码而言)

欧克,言归正传,让我们回到药监局的爬取上吧。如果不出意外的话,这是 requests 模块的最后练习了,结束之后就是激动人心的数据解析了。

先说说药监局网站,我不清楚是因为我用的是学校局域网的原因,还是药监局网站本身的数据维护更新原因,我这边晚上八点半之后就打开不了药监局网站了。

闲话少说(其实说了很多),我们先打开药监局网站(http://scxk.nmpa.gov.cn:81/xk/),一探究竟。

当我们随便点击一家企业时,得到的界面如下:


而这些企业具体信息是我们今天要爬取的对象数据。

首先我们来爬取药监局的首页数据。
代码如下:

import requests

if __name__ == "__main__":
    # UA 伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定 URL
    url = "http://scxk.nmpa.gov.cn:81/xk/"

    # 发送请求
    page_text = requests.get(url, headers = header).text

    # 保存
    with open("./药监局.html", "w", encoding = "utf-8") as fp:
        fp.write(page_text)
    
    print("over!!!")

然后我们打开保存的文件一看。

唉,为什么,明明已经加载完成了,但我们看不到任何企业的信息?

别着急,让我们现在回到药监局的首页,打开抓包工具的 “ Network ” 分析一波(当然其实我们可以使用 数据解析 解决这个问题,但实际上我们还没学不是吗?)。欧克,回到抓包工具,点击 response。


然后在按下 “ctrl” + “F”,开始查找


我们发现网页源码上并没有 “海南” , 但我们的公司名称里却有,这说明,我们对应的 url 并不能获取我们需要的数据,那么这些数据在哪里呢?不知道你们有没有想到我们前面提到过的 AJAX。好吧,既然我们没有别的办法,那就试试喽。

结果这一看真是不得了。


response 里的 json 不就是我们想要的吗?赶紧兴奋地去在线解析一下

我们会发现这些数据里面的 ID 特别显眼,然后再回到我们公司的具体信息的页面,一看,我的天呀,这是什么啊。

这不就是我们要的 url 里的动态部分吗?别太激动了,试验一下。


一验证,发现果然如此,这不得仰天长啸一翻,天不亡我。

好了,既然得到了这些信息,我们是不是就可以写代码了吗?

当然你要写没有拦你,但你打开一看自己得到的数据或是网页,就会发现,结果和前面一样,没有任何数据。然后我们再一次重复上面的数据就会发现数据还是被保存在 XHR 的请求中,是不是特别想说一句 “ 禁止套娃 ”?

不管有多少脏话要骂,还是要写代码,唉,要不边写边骂?

代码如下:

import requests

if __name__ == "__main__":
    # UA 伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定 XHR 的 url
    url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"

    # data
    data = {
        "on": "true",
        "page": "1",
        "pageSize": "15",
        "productName": "", 
        "conditionType": "1",
        "applyname": "",
        "applysn": ""
        }

    # 存储最后的 ID 数据
    id_list = []
    
    for page in range(1, 3): # 翻两页
        data["page"] = str(page)

        # 发送请求命令,获取 json 数据
        data_json = requests.post(url, data = data, headers = header).json()

        # 分析一下 json 数据的结构
        data_list = data_json["list"]

        for i in data_list:
            id_list.append(i["ID"])

    # 公司具体信息网页的 XHR 中的 url
    new_url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"

    data = {
        "id": "5eb10afc74a2462c8e86652ec8d90a48"}

    for ID in id_list:
        data["id"] = ID

        # 发送请求
        response = requests.post(new_url, data = data, headers = header).json()

        # 这是一个json串,我们可以先在线解析,再保存我们想要的东西
        name = response["epsName"]

        # 保存
        with open(".公司信息.text", "a", encoding = "utf-8") as fp:
            fp.write("公司名称:" + response["epsName"] + "\n" + "公司地址:" + response["epsProductAddress"] + "\n" + "法定代表人:" + response["legalPerson"] + "\n" + "\n")

        # 提示
        print(name + "的信息下载完成!!!")

我们运行一下程序,结果如下:

打开文件一看


文章作者: New Ass
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 New Ass !
  目录