美文网首页
Urllib库的使用三---GET方法

Urllib库的使用三---GET方法

作者: IT的咸鱼 | 来源:发表于2018-10-17 18:35 被阅读0次

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

    Get方式

    GET请求一般用于我们向服务器获取数据,比如说,我们用百度搜索美女:
    https://www.baidu.com/s?wd=美女

    最终中文被转换为十六进制的数据 https://www.baidu.com/swd=%E7%BE%8E%E5%A5%B3

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

    # urllib_get.py
    url = "http://www.baidu.com/s"
    word = {"wd":"美女"}
    word = urllib.parse.urlencode(word) #转换成url编码格式(字符串)
    newurl = url + "?" + word    # url首个分隔符就是 ?
    headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    request = urllib.request.Request(newurl, headers=headers)
    response = urllib.request.urlopen(request)
    print (response.read())
    

    实例

    批量爬取贴吧页面数据

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

    百度贴吧美女吧

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

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

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

    发现规律了吧,贴吧中每个页面不同之处,就是url最后的pn的值,其余的都是一样的,我们可以抓住这个规律。

    简单写一个小爬虫程序,来爬取百度美女吧的所有网页。

    1. 先写一个main,提示用户输入要爬取的贴吧名,并用urllib.urlencode()进行转码,然后组合url,假设是美女吧,那么组合后的url就是:http://tieba.baidu.com/f?kw=美女
    # 模拟 main 函数
    
    if __name__ == "__main__":
    
        kw = input("请输入需要爬取的贴吧:")
        # 输入起始页和终止页,str转成int类型
        beginPage = int(input("请输入起始页:"))
        endPage = int(input("请输入终止页:"))
    
        url = "http://tieba.baidu.com/f?"
        key = urllib.parse.urlencode({"kw" : kw})
    
        # 组合后的url示例:http://tieba.baidu.com/f?kw=%E7%BE%8E%E5%A5%B3
        url = url + key
        tiebaSpider(url, beginPage, endPage)
    
    
    1. 接下来,我们写一个百度贴吧爬虫接口,我们需要传递3个参数给这个接口, 一个是main里组合的url地址,以及起始页码和终止页码,表示要爬取页码的范围。
    
    import urllib.request
    import urllib.parse
    def tiebaSpider(url, beginPage, endPage):
    
        """
            作用:负责处理url,分配每个url去发送请求
            url:需要处理的第一个url
            beginPage: 爬虫执行的起始页面
            endPage: 爬虫执行的截止页面
        """
    
        for page in range(beginPage, endPage + 1):
            pn = (page - 1) * 50
    
            filename = "第" + str(page) + "页.html"
            # 组合为完整的 url,并且pn值每次增加50
            fullurl = url + "&pn=" + str(pn)
            #print(fullurl)
    
            # 调用loadPage()发送请求获取HTML页面
            html = loadPage(fullurl, filename)
            # 将获取到的HTML页面写入本地磁盘文件
            writeFile(html, filename)
    
    
    1. 我们已经之前写出一个爬取一个网页的代码。现在,我们可以将它封装成一个小函数loadPage,供我们使用。
    def loadPage(url, filename):
        '''
            作用:根据url发送请求,获取服务器响应文件
            url:需要爬取的url地址
            filename: 文件名
        '''
        print ("正在下载" + filename)
    
        headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
    
        request = urllib.request.Request(url, headers = headers)
        response = urllib.request.urlopen(request)
        return response.read()
    
    
    1. 最后如果我们希望将爬取到了每页的信息存储在本地磁盘上,我们可以简单写一个存储文件的接口。
    def writeFile(html, filename):
    
        """
            作用:保存服务器响应文件到本地磁盘文件里
            html: 服务器响应文件
            filename: 本地磁盘文件名
        """
        print ("正在存储" + filename)
        with open(filename, 'w') as f:
            f.write(html)
    
    

    其实很多网站都是这样的,同类网站下的html页面编号,分别对应网址后的网页序号,只要发现规律就可以批量爬取页面了

    相关文章

      网友评论

          本文标题:Urllib库的使用三---GET方法

          本文链接:https://www.haomeiwen.com/subject/xterzftx.html