zoukankan      html  css  js  c++  java
  • Python扫描器-爬虫基础

    0x1、基础框架原理

    1.1、爬虫基础

    爬虫程序主要原理就是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中

    1.1、基础原理

    • 1、发起HTTP请求
    • 2、获取响应内容
    • 3、解析内容
        解析html数据
        解析json数据
        解析二进制数据
    

    4、保存数据(数据库、文件)

    1.2、发起HTTP请求-Request

    • 1、HTTP请求方法:
        常用的请求方法:GET,POST
        其他请求方法:HEAD,PUT,DELETE,OPTHONS
    
    • 2、请求URL

    Web上每种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个通用资源标志符(Universal Resource Identifier, URI)进行定位。

    URI通常由三部分组成:

        ①访问资源的命名机制;
        
        ②存放资源的主机名;
        
        ③资源自身 的名称,由路径表示。
    

    如下面的URI:

        http://www.why.com.cn/myhtml/html1223/
    

    我们可以这样解释它:

    ①这是一个可以通过HTTP协议访问的资源,

    ②位于主机 www.webmonkey.com.cn上,

    ③通过路径“/html/html40”访问。

    • 3、请求头
        User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户
        host : 主机头
        cookies:cookie用来保存登录信息
    
    • 4、请求体
        get方式,请求体没有内容
        post方式,请求体是format data
    

    1.3、获取响应内容-Response

    • 1、响应状态
        200:代表成功
        301:代表跳转
        404:文件不存在
        403:权限
        502:服务器错误
    
    • 2、Respone header
      set-cookie:告诉浏览器,把cookie保存下来
    
    • 3、preview就是网页源代码

    最主要的部分,包含了请求资源的内容如网页html,图片、二进制数据等

    1.4、练手库-Urllib

    下载页面

    三行代码下载一个页面

    import urllib.request
    
    response = urllib.request.urlopen('https://www.wikipedia.org')
    
    print(response.read())
    

    变量html包含html格式的网页数据。

    模拟Web浏览器

    Web浏览器把浏览器名称、版本与请求一起发送,这称为用户代理。Python可以使用下面的代码模仿这种方式。User-Agent字符串包含Web浏览器的名称和版本号:

    import urllib.request
     
    headers = {}
    headers['User-Agent'] = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:48.0) Gecko/20100101 Firefox/48.0"
     
    req = urllib.request.Request('https://arstechnica.com', headers = headers)
    html = urllib.request.urlopen(req)
    print(html.read())
    

    提交数据-GET

    与GET请求一起传递的参数是通过附加到URL末尾的查询字符串完成的,因此添加参数不需要任何特殊函数或类,需要做的事情就是确保查询字符串正确编码和格式化。

    创建包含在查询字符串中的键值对,可以创建一个字典对象,然后使用urllib.parse模块中包含的urllib的urlencode()函数对该对象进行编码和格式化。

    import urllib.request   
    import urllib.parse      
    url = "http://example.com"   
    params = {       
        "param1": "arg1",       
        "param2": "arg2",       
        "param3": "arg3"   
    }      
    query_string = urllib.parse.urlencode( params )      
    url = url + "?" + query_string      
    with urllib.request.urlopen( url ) as response:        
        response_text = response.read()        
        print( response_text )    
    

    提交数据-POST

    创建一个字典来存储POST参数的键值对,然后使用urlencode()进行格式化。格式化字符串编码为字节并指定所需的字符编码 。然后使用urlopen()正常打开请求,添加数据作为额外的参数,将请求类型更改为POST(默认为GET) ,其中3个参数会附加到请求正文

    import urllib.request
    import urllib.parse
    url = "http://example.com"
    params = {
        "param1": "arg1",
        "param2": "arg2",
        "param3": "arg3"
    }
    query_string = urllib.parse.urlencode( params )
    data = query_string.encode("ascii")
    with urllib.request.urlopen(url,data) as response:
        response_text = response.read()
        print(response_text)
    

    遇到的问题-SSL需要验证

    urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'hao123.com'. (_ssl.c:1051)>
    

    解决方案

    import ssl
    import urllib.request
    context = ssl._create_unverified_context()
    html = urllib.request.urlopen('https://hao123.com/', context=context)
    print(html.read().decode('utf-8'))
    
  • 相关阅读:
    使用PWS调试cgi,php
    解决联想电脑常见故障及内存不足的几种方法
    How Many Tables (并查集)
    Prim
    小希的迷宫(并查集)
    并查集
    Is It A Tree?(并查集)
    hdu 1003 Max Sum(最大子窜和)
    More is better(并查集)
    01背包精讲
  • 原文地址:https://www.cnblogs.com/17bdw/p/10735127.html
Copyright © 2011-2022 走看看