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

2018-10-17  本文已影响0人  IT的咸鱼

一般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页面编号,分别对应网址后的网页序号,只要发现规律就可以批量爬取页面了

上一篇下一篇

猜你喜欢

热点阅读