最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python爬虫之GET和POST请求

    正文概述    2020-06-24   305

    Python爬虫之GET和POST请求

    爬虫——GET请求和POST请求

    urllib.parse.urlencode()和urllib.parse.unquote()

    编码工作使用urllib.parse的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。

    # python3.5控制台中测试结果
    >>> import urllib
    >>> word = {"wd":"爬虫"}
    # 通过urllib.parse.urlencode()方法,将字典键值对按URL编码转换,从而能被wed服务器接受。
    >>> urllib.parse.urlencode(word)
    'wd=%E7%88%AC%E8%99%AB'
    # 通过urllib.parse.unquote()方法,把URL编码字符串,转换回原先的字符串。
    >>> urllib.parse.unquote(word)
    'wd=爬虫'

    一般HTTP请求提交数据,需要编码成URL编码格式,然后做为URL的一部分,或者作为参数传到Request对象中。

    GET方式

    GET请求一般用于我们向服务器获取数据,比如说,我们用百度搜索 爬虫:https://www.baidu.com/s?wd=爬虫(https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB)

    我们可以看到在请求部分里,http://www.baidu.com/s? 之后出现一个长长的字符串,其中就包含我们要查询的关键词“爬虫”,于是我们可以尝试用默认的GET方式来发送请求。

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
     
    # 导入库
    import urllib.request
    import urllib
     
    url = "http://www.baidu.com/s?"
    word = {"wd":"爬虫"}
    # 转换成url编码格式
    word = urllib.parse.urlencode(word)
    # 拼接成完整的url
    full_url = url + word
    # chrome 的 User-Agent,包含在 header里
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
    # url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent
    request = urllib.request.Request(full_url, headers = header)
    # 向服务器发送这个请求
    response = urllib.request.urlopen(request)
     
    html = response.read()
    fo = open("baidu.html", "wb")
    fo.write(html)
    fo.close()

    批量爬取贴吧页面数据

    首先我们创建一个python文件:tiebaSpider.py,我们要完成的功能是,输入一个百度贴吧的地址,比如:百度贴吧LOL吧

    第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

    第二页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

    第三页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

    ……

    爬取以上页面的内容

    相关推荐:《Python视频教程》

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
     
    """
    功能:批量爬取贴吧页面数据
    目标地址:百度贴吧LOL吧
    分析:
        第一页:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
        第二页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
        第三页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100
        ……
    规律:
        贴吧中每个页面URL不同之处,就是最后的pn值,其余的都是一样的。其pn = (page - 1) * 50
        url = "https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn="
        pn = (page - 1) * 50
        full_url = url + str(pn)
    """
     
    # 导入库
    import urllib
    import urllib.request
     
    # 根据url地址,获取服务器响应文件
    def loadPage(url):
        """
        功能:根据url地址,获取服务器响应文件
        :param url: url地址
        :return: 获取的服务器响应文件信息
        """
        # chrome 的User-Agent 头
        header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
        # url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent
        request = urllib.request.Request(url, headers = header)
        # 向服务器发送这个请求
        reponse = urllib.request.urlopen(request)
        # 获取响应文件中的全部内容
        html = reponse.read()
     
        return html
     
    # 存储文件
    def writeFile(html, file_name):
        """
        功能:存服务器响应文件到本地磁盘文件里
        :param html: 服务器响应文件内容
        :param file_name: 本地磁盘文件名
        :return: None
        """
        with open(file_name, "wb") as f:
            f.write(html)
     
     
    # 贴吧爬虫函数
    def tiebaSpider(url, begin_page, end_page):
        """
        功能:处理从begin_page到end_page的url页面
        :param url: url地址
        :param begin_page: 需爬取的起始页
        :param end_page: 需爬取的终止页
        :return:
        """
        for page in range(begin_page, end_page + 1):
            pn = (page - 1) * 50
            full_url = url + str(pn)
            file_name = "第" + str(page) + "页.html"
            print("正在爬取" + file_name)
            # 获取full_url对应的html文件信息
            html = loadPage(full_url)
            print("正在存储" + file_name)
            # 存储full_url对应的html文件信息
            writeFile(html, file_name)
     
    # 主函数
    if __name__ == '__main__':
        url = "https://tieba.baidu.com/f?"
        # 输入需爬取的贴吧
        kw = input("请输入需要爬取的贴吧:")
        # 输入需爬取的起始页和终止页
        begin_page = int(input("请输入起始页:"))
        end_page = int(input("请输入终止页:"))
        key = urllib.parse.urlencode({"kw":kw})
        # 组合的的url示例:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=
        url = url + key + "&ie=utf-8&pn="
        # 调用贴吧爬虫函数,爬取数据
        tiebaSpider(url, begin_page, end_page)

    POST方式

    Request请求对象里有data参数,这就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要有匹配键值对。

    以下以有道词典翻译网站为例为模拟POST请求。

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
      
    """
    POST方式:以有道词典翻译网站为例
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
    """
     
    # 导入库
    import urllib.request
    import urllib
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
    # chrome 的 User-Agent,包含在 header里
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
     
    word = input("请输入需要翻译的词条:")
     
    from_data = {
        "i":word,
        "from":"AUTO",
        "to":"AUTO",
        "smartresult":"dict",
        "doctype":"json",
        "version":"2.1",
        "keyfrom":"fanyi.wed"
    }
    data = urllib.parse.urlencode(from_data)
    data = data.encode(encoding="utf-8")  # str转bytes
     
    request = urllib.request.Request(url, data = data, headers = header)
     
    response = urllib.request.urlopen(request)
     
    html = response.read().decode(encoding = "utf-8").strip()
     
    print(html)

    获取AJAX加载的内容

    有些网页内容是使用AJAX加载的,AJAX一般返回的是JSON,直接对AJAX地址进行POST或GET,就能返回JSON数据。

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
      
    """
    获取AJAX加载的数据
    有些网页内容使用AJAX加载,只要记得,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了。
    以豆瓣为例:
    url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100:90&action&start=0&limit=100"
    """
     
    # 导入库
    import urllib
    import urllib.request
     
    url = "https://movie.douban.com/j/chart/top_list?"
    # chrome 的 User-Agent,包含在 header里
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
    from_data = {
        'type':'11',
        'interval_id':'100:90',
        'action':'',
        'start':'0',
        'limit':'100'
    }
    data = urllib.parse.urlencode(from_data)
    data = data.encode(encoding="utf-8")  # str转bytes
     
    request = urllib.request.Request(url, data = data, headers = header)
     
    response = urllib.request.urlopen(request)
     
    html = response.read().decode(encoding = "utf-8")
     
    print(html)

    下载网 » Python爬虫之GET和POST请求

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元