zoukankan      html  css  js  c++  java
  • 六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    利用python系统自带的urllib库写简单爬虫

    urlopen()获取一个URL的html源码
    read()读出html源码内容
    decode("utf-8")将字节转化成字符串

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import urllib.request
    html = urllib.request.urlopen('http://edu.51cto.com/course/8360.html').read().decode("utf-8")
    print(html)
    复制代码
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-param" content="_csrf">
        <meta name="csrf-token" content="X1pZZnpKWnQAIGkLFisPFT4jLlJNIWMHHWM6HBBnbiwPbz4/LH1pWQ==">
    复制代码

    正则获取页面指定内容

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import urllib.request
    import re
    html = urllib.request.urlopen('http://edu.51cto.com/course/8360.html').read().decode("utf-8")   #获取html源码
    pat = "51CTO学院Python实战群((d*?))"      #正则规则,获取到QQ号
    rst = re.compile(pat).findall(html)
    print(rst)
    
    #['325935753']
    复制代码

    urlretrieve()将网络文件下载保存到本地,参数1网络文件URL,参数2保存路径

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from urllib import request
    import re
    import os
    
    file_path = os.path.join(os.getcwd() + '/222.html')    #拼接文件保存路径
    # print(file_path)
    request.urlretrieve('http://edu.51cto.com/course/8360.html', file_path) #下载这个文件保存到指定路径
    复制代码

    urlcleanup()清除爬虫产生的内存

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from urllib import request
    import re
    import os
    
    file_path = os.path.join(os.getcwd() + '/222.html')    #拼接文件保存路径
    # print(file_path)
    request.urlretrieve('http://edu.51cto.com/course/8360.html', file_path) #下载这个文件保存到指定路径
    request.urlcleanup()
    复制代码

    info()查看抓取页面的简介

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import urllib.request
    import re
    html = urllib.request.urlopen('http://edu.51cto.com/course/8360.html')   #获取html源码
    a = html.info()
    print(a)
    
    # C:UsersadminAppDataLocalProgramsPythonPython35python.exe H:/py/15/chshi.py
    # Date: Tue, 25 Jul 2017 16:08:17 GMT
    # Content-Type: text/html; charset=UTF-8
    # Transfer-Encoding: chunked
    # Connection: close
    # Set-Cookie: aliyungf_tc=AQAAALB8CzAikwwA9aReq63oa31pNIez; Path=/; HttpOnly
    # Server: Tengine
    # Vary: Accept-Encoding
    # Vary: Accept-Encoding
    # Vary: Accept-Encoding
    复制代码

    getcode()获取状态码

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import urllib.request
    import re
    html = urllib.request.urlopen('http://edu.51cto.com/course/8360.html')   #获取html源码
    a = html.getcode()  #获取状态码
    print(a)
    
    #200
    复制代码

    geturl()获取当前抓取页面的URL

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import urllib.request
    import re
    html = urllib.request.urlopen('http://edu.51cto.com/course/8360.html')   #获取html源码
    a = html.geturl()  #获取当前抓取页面的URL
    print(a)
    
    #http://edu.51cto.com/course/8360.html
    复制代码

    timeout抓取超时设置,单位为秒

    是指抓取一个页面时对方服务器响应太慢,或者很久没响应,设置一个超时时间,超过超时时间就不抓取了

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import urllib.request
    import re
    html = urllib.request.urlopen('http://edu.51cto.com/course/8360.html',timeout=30)   #获取html源码
    a = html.geturl()  #获取当前抓取页面的URL
    print(a)
    
    #http://edu.51cto.com/course/8360.html
    复制代码

    自动模拟http请求

    http请求一般常用的就是get请求和post请求

    get请求

    比如360搜索,就是通过get请求并且将用户的搜索关键词传入到服务器获取数据的

    所以我们可以模拟百度http请求,构造关键词自动请求

    quote()将关键词转码成浏览器认识的字符,默认网站不能是中文

    复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import urllib.request
    import re
    gjc = "手机"     #设置关键词
    gjc = urllib.request.quote(gjc)         #将关键词转码成浏览器认识的字符,默认网站不能是中文
    url = "https://www.so.com/s?q="+gjc     #构造url地址
    # print(url)
    html = urllib.request.urlopen(url).read().decode("utf-8")  #获取html源码
    pat = "(w*<em>w*</em>w*)"            #正则获取相关标题
    rst = re.compile(pat).findall(html)
    # print(rst)
    for i in rst:
        print(i)                            #循环出获取的标题
    
        # 官网 < em > 手机 < / em >
        # 官网 < em > 手机 < / em >
        # 官网 < em > 手机 < / em > 这么低的价格
        # 大牌 < em > 手机 < / em > 低价抢
        # < em > 手机 < / em >
        # 淘宝网推荐 < em > 手机 < / em >
        # < em > 手机 < / em >
        # < em > 手机 < / em >
        # < em > 手机 < / em >
        # < em > 手机 < / em >
        # 苏宁易购买 < em > 手机 < / em >
        # 买 < em > 手机 < / em >
        # 买 < em > 手机 < / em >
    复制代码

     post请求

    urlencode()封装post请求提交的表单数据,参数是字典形式的键值对表单数据
    Request()提交post请求,参数1是url地址,参数2是封装的表单数据

    复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import urllib.request
    import urllib.parse
    
    posturl = "http://www.iqianyue.com/mypost/"
    shuju = urllib.parse.urlencode({                #urlencode()封装post请求提交的表单数据,参数是字典形式的键值对表单数据
        'name': '123',
        'pass': '456'
        }).encode('utf-8')
    req = urllib.request.Request(posturl,shuju)     #Request()提交post请求,参数1是url地址,参数2是封装的表单数据
    html = urllib.request.urlopen(req).read().decode("utf-8")  #获取post请求返回的页面
    print(html)
    复制代码
  • 相关阅读:
    在centos7上使用packstack安装openstack
    解决 React-Native: Android project not found. Maybe run react-native android first?
    javascript_11-函数面试题
    javascript_10-函数
    前端面试记录NO.1
    javascript_09-数组
    javascript_08-while 和 do while
    javascript_07-break 和 continue
    javascript_05-操作符
    javascript_06-控制流程
  • 原文地址:https://www.cnblogs.com/meng-wei-zhi/p/8182521.html
Copyright © 2011-2022 走看看