zoukankan      html  css  js  c++  java
  • Python网络爬虫

    什么是爬虫

    爬虫的定义:

      爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程。

    哪些语言可以实现爬虫:

      php:可以实现爬虫,但是php在实现爬虫中支持多线程和多进程方面做的不好。

      java:可以实现爬虫。java可以非常好的处理和实现爬虫,但是java实现爬虫代码较为臃肿,重构成本较大。

      C,C++:可以实现爬虫,但这种方式较难,都是大佬级人物能够展示用的。

      python:python实现和处理爬虫语法简单,代码优美,支持的模块繁多,学习成本低,具有非常强大的框架(scrapy等)

    爬虫的分类:

      通用爬虫:通用爬虫是搜索引擎(Baidu、Google、Yahoo等)“抓取系统”的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。  简单来讲就是尽可能的;把互联网上的所有的网页下载下来,放到本地服务器里形成备分,在对这些网页做相关处理(提取关键字、去掉广告),最后提供一个用户检索接口。 

      搜索引擎如何抓取互联网上的网站数据?

    • 门户网站主动向搜索引擎公司提供其网站的url

    • 搜索引擎公司与DNS服务商合作,获取网站的url

    • 门户网站主动挂靠在一些知名网站的友情链接中

      聚焦爬虫:聚焦爬虫是根据指定的需求抓取网络上指定的数据。例如:获取豆瓣上电影的名称和影评,而不是获取整张页面中所有的数据值。

      robots.txt协议

        - 如果自己的门户网站中的指定页面中的数据不想让爬虫程序爬取到的话,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取。robots协议的编写格式可以观察淘宝网的robots(访问www.taobao.com/robots.txt即可)。但是需要注意的是,该协议只是相当于口头的协议,并没有使用相关技术进行强制管制,所以该协议是防君子不防小人。但是我们在学习爬虫阶段编写的爬虫程序可以先忽略robots协议。

      增量式爬虫:用于检测网站更新的情况,从而爬取除网站中最新更新出的数据。

      反爬机制:门户网站通过相应的策略和技术手段,防止爬虫程序进行网站数据的爬取。

      反反爬虫:爬虫程序通过相应的策略和技术手段,破解门户网站的反爬虫手段,从而爬取到相应的数据。

    http和https协议

    http协议:

      HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。白话一点就说HTTP协议就是服务器(Server)和客户端(Client)之间进行数据交互(相互传输数据)的一种形式。

    http工作原理:

      HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

    HTTP四点须注意的事项:

        - HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

        - HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

        - HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

        - HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    HTTP之URL:

      HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

      以下面这个URL为例,介绍下普通URL的各部分组成:http://www.aspxfans.com:8080/news/index.aspboardID=5&ID=24618&page=1#name从上面的URL可以看出,一个完整的URL包括以下几部分:

        - 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

        - 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

        - 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

        - 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

        - 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

        - 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

        - 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

    HTTP之request:

      客户端发送一个HTTP请求到服务器的请求消息包括以下组成部分:

      

      报文头:常被叫做请求头,请求头中存储的是该请求的一些主要说明(自我介绍)。服务器据此获取客户端的信息。

            常见的请求头:

            accept:浏览器通过这个头告诉服务器,它所支持的数据类型

            Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
            Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
            Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
            Host:浏览器通过这个头告诉服务器,想访问哪台主机
            If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
            Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
            Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
            X-Requested-With: XMLHttpRequest 代表通过ajax方式进行访问

            User-Agent:请求载体的身份标识

      报文体:常被叫做请求体,请求体中存储的是将要传输/发送给服务器的数据信息。

     HTTP之response:

      服务器回传一个HTTP响应到客户端的响应消息包括以下组成部分:

        状态码:以“清晰明确”的语言告诉客户端本次请求的处理结果。

        HTTP的响应状态码由5段组成: 

      •   1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
      •   2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
      •   3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
      •   4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
      •   5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

        相应头:响应的详情展示

            常见的相应头信息:

                Location: 服务器通过这个头,来告诉浏览器跳到哪里
                Server:服务器通过这个头,告诉浏览器服务器的型号
                Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
                Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
                Content-Language: 服务器通过这个头,告诉浏览器语言环境
                Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
                Refresh:服务器通过这个头,告诉浏览器定时刷新
                Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
                Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
                Expires: -1 控制浏览器不要缓存
                Cache-Control: no-cache
                Pragma: no-cache

        相应体:根据客户端指定的请求信息,发送给客户端的指定数据

    HTTPS协议

    官方概念:

      HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。

    HTTPS采用的加密技术:

      SSL加密技术:

        SSL采用的加密技术叫做“共享密钥加密”,也叫作“对称密钥加密”,这种加密方法是这样的,比如客户端向服务器发送一条信息,首先客户端会采用已知的算法对信息进行加密,比如MD5或者Base64加密,接收端对加密的信息进行解密的时候需要用到密钥,中间会传递密钥,(加密和解密的密钥是同一个),密钥在传输中间是被加密的。这种方式看起来安全,但是仍有潜在的危险,一旦被窃听,或者信息被挟持,就有可能破解密钥,而破解其中的信息。因此“共享密钥加密”这种方式存在安全隐患:

    非对称秘钥加密技术

      “非对称加密”使用的时候有两把锁,一把叫做“私有密钥”,一把是“公开密钥”,使用非对象加密的加密方式的时候,服务器首先告诉客户端按照自己给定的公开密钥进行加密处理,客户端按照公开密钥加密以后,服务器接受到信息再通过自己的私有密钥进行解密,这样做的好处就是解密的钥匙根本就不会进行传输,因此也就避免了被挟持的风险。就算公开密钥被窃听者拿到了,它也很难进行解密,因为解密过程是对离散对数求值,这可不是轻而易举就能做到的事。以下是非对称加密的原理图:

      但是非对称秘钥加密技术也存在如下缺点:

            第一个是:如何保证接收端向发送端发出公开秘钥的时候,发送端确保收到的是预先要发送的,而不会被挟持。只要是发送密钥,就有可能有被挟持的风险。

            第二个是:非对称加密的方式效率比较低,它处理起来更为复杂,通信过程中使用就有一定的效率问题而影响通信速度

     https的证书机制

       在上面我们讲了非对称加密的缺点,其中第一个就是公钥很可能存在被挟持的情况,无法保证客户端收到的公开密钥就是服务器发行的公开密钥。此时就引出了公开密钥证书机制。数字证书认证机构是客户端与服务器都可信赖的第三方机构。证书的具体传播过程如下:

      1:服务器的开发者携带公开密钥,向数字证书认证机构提出公开密钥的申请,数字证书认证机构在认清申请者的身份,审核通过以后,会对开发者申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将密钥放在证书里面,绑定在一起

     

       2:服务器将这份数字证书发送给客户端,因为客户端也认可证书机构,客户端可以通过数字证书中的数字签名来验证公钥的真伪,来确保服务器传过来的公开密钥是真实的。一般情况下,证书的数字签名是很难被伪造的,这取决于认证机构的公信力。一旦确认信息无误之后,客户端就会通过公钥对报文进行加密发送,服务器接收到以后用自己的私钥进行解密。

     爬取get请求的页面

    urllib库

      urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求。其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2。

      执行一个爬取百度页面所有数据的的程序:

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    #导包
    import urllib.request
    import urllib.parse
    if __name__ == "__main__":
        #指定爬取的网页url
         url = 'http://www.baidu.com/'
        #通过urlopen函数向指定的url发起请求,返回响应对象
         reponse = urllib.request.urlopen(url=url)
         #通过调用响应对象中的read函数,返回响应回客户端的数据值(爬取到的数据)
         data = reponse.read()#返回的数据为byte类型,并非字符串
         print(data)#打印显示爬取到的数据值。
    
    
    #补充说明
    urlopen函数原型:urllib.request.urlopen(url, data=None, timeout=<object object at 0x10af327d0>, *, cafile=None, capath=None, cadefault=False, context=None)
    
    url参数:指定向哪个url发起请求
    data参数:可以将post请求中携带的参数封装成字典的形式传递给该参数
    
    
    urlopen函数返回的响应对象,相关函数调用介绍:
    response.headers():获取响应头信息
    response.getcode():获取响应状态码
    response.geturl():获取请求的url
    response.read():获取响应中的数据值(字节类型)

      将爬取到的百度首页数据写入到文件中进行存储

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    import urllib.request
    import urllib.parse
    if __name__ == "__main__":
        url = 'http://news.baidu.com/'
        reponse = urllib.request.urlopen(url=url)
        #decode()作用是将响应中字节(byte)类型的数据值转成字符串类型
        data = reponse.read().decode()
        #使用IO操作将data表示的数据值以'w'权限的方式写入到news.html文件中
        with open('./news.html','w') as fp:
            fp.write(data)
        print('写入文件完毕')

      爬取网络上的某张图片数据,进行存储到本地

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    import urllib.request
    import urllib.parse
    #如下两行代码表示忽略https证书,因为下面请求的url为https协议的请求,如果请求不是https则该两行代码可不用。
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    if __name__ == "__main__":
        #url是https协议的
        url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536918978042&di=172c5a4583ca1d17a1a49dba2914cfb9&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0dd7912397dda144f04b5d9cb9b7d0a20cf48659.jpg'
        reponse = urllib.request.urlopen(url=url)
        data = reponse.read()#因为爬取的是图片数据值(二进制数据),则无需使用decode进行类型转换。
        with open('./money.jpg','wb') as fp:
            fp.write(data)
        print('写入文件完毕')

      url的特性:url必须为ASCII编码的数据值。所以我们在爬虫代码中编写url时,如果url中存在非ASCII编码的数据值,则必须对其进行ASCII编码后,该url方可被使用。

      例如爬取词条为为‘周杰伦’的页面数据

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    import urllib.request
    import urllib.parse
    
    if __name__ == "__main__":
        #原始url中存在非ASCII编码的值,则该url无法被使用。
        #url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦'
        #处理url中存在的非ASCII数据值
        url = 'http://www.baidu.com/s?'
        #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数
        param = {
            'ie':'utf-8',
            'wd':'周杰伦'
        }
        #使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码
        param = urllib.parse.urlencode(param)
        #将编码后的数据和url进行整合拼接成一个完整可用的url
        url = url + param
        print(url)
        response = urllib.request.urlopen(url=url)
        data = response.read()
        with open('./周杰伦.html','wb') as fp:
            fp.write(data)
        print('写入文件完毕')

      通过自定义请求对象,用于伪装爬虫程序请求的身份。

        之前在讲解http常用请求头信息时,我们讲解过User-Agent参数,简称为UA,该参数的作用是用于表明本次请求载体的身份标识。如果我们通过浏览器发起的请求,则该请求的载体为当前浏览器,则UA参数的值表明的是当前浏览器的身份标识表示的一串数据。如果我们使用爬虫程序发起的一个请求,则该请求的载体为爬虫程序,那么该请求的UA为爬虫程序的身份标识表示的一串数据。有些网站会通过辨别请求的UA来判别该请求的载体是否为爬虫程序,如果为爬虫程序,则不会给该请求返回响应,那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值,这也是反爬虫的一种初级技术手段。那么为了防止该问题的出现,则我们可以给爬虫程序的UA进行伪装,伪装成某款浏览器的身份标识。

        上述案例中,我们是通过request模块中的urlopen发起的请求,该请求对象为urllib中内置的默认请求对象,我们无法对其进行UA进行更改操作。urllib还为我们提供了一种自定义请求对象的方式,我们可以通过自定义请求对象的方式,给该请求对象中的UA进行伪装(更改)操作。  

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    import urllib.request
    import urllib.parse
    
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    if __name__ == "__main__":
        #原始url中存在非ASCII编码的值,则该url无法被使用。
        #url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦'
        #处理url中存在的非ASCII数据值
        url = 'http://www.baidu.com/s?'
        #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数
        param = {
            'ie':'utf-8',
            'wd':'周杰伦'
        }
        #使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码
        param = urllib.parse.urlencode(param)
        #将编码后的数据和url进行整合拼接成一个完整可用的url
        url = url + param
        #将浏览器的UA数据获取,封装到一个字典中。该UA值可以通过抓包工具或者浏览器自带的开发者工具中获取某请求,从中获取UA的值
        headers={
            'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
        }
        #自定义一个请求对象
        #参数:url为请求的url。headers为UA的值。data为post请求的请求参数(后面讲)
        request = urllib.request.Request(url=url,headers=headers)
    
        #发送我们自定义的请求(该请求的UA已经进行了伪装)
        response = urllib.request.urlopen(request)
    
        data=response.read()
    
        with open('./周杰伦.html','wb') as fp:
            fp.write(data)
        print('写入数据完毕')

    requests模块

    什么是requests

      requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。

    为什么要使用requests模块

      因为在使用urllib模块的时候,会有诸多不便之处:

        手动处理url编码

        手动处理post请求参数

        处理cookie和代理操作繁琐

      使用requests模块:

        自动处理url编码

        自动处理post请求参数

        简化cookie和代理操作

    如何使用requests模块

      安装方式:pip install requests
      使用流程:

        指定url

        基于requests模块发起请求

        获取响应对象中的数据值

        持久化存储

    实例化代码分析

      爬取搜狗指定词条搜索后的页面数据

    import requests
    import os
    #指定搜索关键字
    word = input('enter a word you want to search:')
    #自定义请求头信息
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        }
    #指定url
    url = 'https://www.sogou.com/web'
    #封装get请求参数
    prams = {
        'query':word,
        'ie':'utf-8'
    }
    #发起请求
    response = requests.get(url=url,params=param)
    
    #获取响应数据
    page_text = response.text
    
    with open('./sougou.html','w',encoding='utf-8') as fp:
        fp.write(page_text)

    请求载体身份标识的伪装:

    • User-Agent:请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。

    • 反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。

    • 反反爬策略:将爬虫程序的UA伪装成某一款浏览器的身份标识

      爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import requests
    import urllib.request
    if __name__ == "__main__":
    
        #指定ajax-get请求的url(通过抓包进行获取)
        url = 'https://movie.douban.com/j/chart/top_list?'
    
        #定制请求头信息,相关的头信息必须封装在字典结构中
        headers = {
            #定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
        }
    
        #定制get请求携带的参数(从抓包工具中获取)
        param = {
            'type':'5',
            'interval_id':'100:90',
            'action':'',
            'start':'0',
            'limit':'20'
        }
        #发起get请求,获取响应对象
        response = requests.get(url=url,headers=headers,params=param)
    
        #获取响应内容:响应内容为json串
        print(response.text)

      小拓展:爬取豆瓣电影分类排行榜中的电影标题和评分信息(至少200条数据)

    url='https://movie.douban.com/j/chart/top_list'
    headers={
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.8 Safari/537.36'
    }
    start=0
    for i in range(10):
        
        params={
            'type': '5',
            'interval_id': '100:90',
            'action': '',
            'start': str(start),
            'limit': '20'
        }
        start+=20
        print(f'正在爬取前{start}条数据')
        json_data=requests.get(url=url,params=params,headers=headers).json()
    #     print(json_data)
        for dic in json_data:
            title=dic['title']
            score=dic['score']
            print(f'电影名称:{title},评分{score}')

      需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import requests
    import urllib.request
    if __name__ == "__main__":
    
        #指定ajax-post请求的url(通过抓包进行获取)
        url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    
        #定制请求头信息,相关的头信息必须封装在字典结构中
        headers = {
            #定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
        }
    
        #定制post请求携带的参数(从抓包工具中获取)
        data = {
            'cname':'',
            'pid':'',
            'keyword':'北京',
            'pageIndex': '1',
            'pageSize': '10'
        }
        #发起post请求,获取响应对象
        response = requests.get(url=url,headers=headers,data=data)
    
        #获取响应内容:响应内容为json串
        print(response.text)

      需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据

    import requests
    from fake_useragent import UserAgent
    
    ua = UserAgent(use_cache_server=False,verify_ssl=False).random
    headers = {
        'User-Agent':ua
    }
    
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    pageNum = 3
    for page in range(3,5):
        data = {
            'on': 'true',
            'page': str(page),
            'pageSize': '15',
            'productName':'',
            'conditionType': '1',
            'applyname':'',
            'applysn':''
        }
        json_text = requests.post(url=url,data=data,headers=headers).json()
        all_id_list = []
        for dict in json_text['list']:
            id = dict['ID']#用于二级页面数据获取
            #下列详情信息可以在二级页面中获取
            # name = dict['EPS_NAME']
            # product = dict['PRODUCT_SN']
            # man_name = dict['QF_MANAGER_NAME']
            # d1 = dict['XC_DATE']
            # d2 = dict['XK_DATE']
            all_id_list.append(id)
        #该url是一个ajax的post请求
        post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
        for id in  all_id_list:
            post_data = {
                'id':id
            }
            response = requests.post(url=post_url,data=post_data,headers=headers)
            #该请求响应回来的数据有两个,一个是基于text,一个是基于json的,所以可以根据content-type,来获取指定的响应数据
            if response.headers['Content-Type'] == 'application/json;charset=UTF-8':
                #print(response.json())
                #进行json解析
                json_text = response.json()
                print(json_text['businessPerson'])

      简易版本爬取药品监督管理总局相关数据

    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.8 Safari/537.36'
    }
    url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    for page in range(1,6):
        data={
            'on': 'true',
            'page': str(page),
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': '',
        }
        print(f'正在爬取第{page}页数据')
        json_data=requests.post(url=url,data=data,headers=headers).json()
        for dic in json_data['list']:
            _id=dic['ID']
            detail_url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
            detail_data={
                'id':str(_id)
            }
            detail_data=requests.post(url=detail_url,data=detail_data,headers=headers).json()
            company_title=detail_data['epsName']
            content=detail_data['certStr']
            print(company_title)
            print(content)

      (注:当前网页刷新因为是post请求刷新出来的数据,所以需要爬取的url地址斌不是访问的url地址,我们需要进行查询我们要爬取的数据具体在哪一个url上面,用查询的数据进行全局搜索即可,查找完毕后,我们获得了信息的每一个id号,我们再根据id号进行查询出来是我们想要的信息数据,拿取出来后,拿取自己想要的值即可)

  • 相关阅读:
    JS编码解码详解
    web的几种返回顶部
    图片的懒加载的两种效果
    获取两个日期差
    C#虚方法
    依赖注入(DI)和Ninject
    在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的
    PetShop的系统架构设计
    C#综合揭秘——细说多线程(下)
    C# Socket编程(4)初识Socket和数据流
  • 原文地址:https://www.cnblogs.com/sikuaiqian/p/11284409.html
Copyright © 2011-2022 走看看