A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

urllib库的简单使用 && 一个简单的Python爬虫示例

本篇文章,介绍urllib.request库的简单使用以及注意的问题。最后实现一个Python爬虫的示例。

本文是基于Python3.6.2实现的。urllib.request相当于Python2.7中的urllib2的库的一部分。

urllib.request库的简单使用

urlopen():
# 请求一个百度地址,返回一个服务器响应的类文件对象response。
response = urllib.request.urlopen('http://www.baidu.com/')

# 读取文件的内容
result = response.read()

# 打印result,输出的就是百度的网页源代码
print(result)

# 打印result的类型,结果是<class 'bytes'>
print(type(result))

# 读取到文件,文件名baidu.html
with open('baidu.html','wb') as f:
    f.write(result)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
通过浏览器打开baidu.html文件,实际和浏览器输出http://www.baidu.com/结果是一样的。

防止爬虫程序的ip被禁
其实上面的程序还不够好,因为我们直接通过urlopen(url)发送请求,实际上在http的请求头中有一个User-Agnet字段会标记为Python-urllib/3.6。如下面的http的headers是通过fiddler抓包获取的。

GET http://www.baidu.com/ HTTP/1.1
Accept-Encoding: identity
Host: www.baidu.com
User-Agent: Python-urllib/3.6
Connection: close
1
2
3
4
5
浏览器访问的header信息如下:

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36
...
1
2
3
4
5
我们通过爬虫程序访问的第三方服务器,服务器就能知道你是通过爬虫程序访问的。因为你的http的请求头信息User-Agent字段出卖了你。所以我们需要修改请求头的User-Agent字段信息,防止ip被禁。

# 定义一个url
url = 'http://www.baidu.com/'

# 定义一个请求头的User-Agent字段,User-Agent的内容可以通过fiddle抓取浏览器访问的url的header中的信息,模拟浏览器访问,也可以网上随便找一个
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}

# 自定义请求头信息,返回一个请求的对象request,Request()参数,还可以接收data参数,表示请求体
request = urllib.request.Request(url,headers = headers)

# 通过urlopen访问url,服务器返回response对象
response = urllib.request.urlopen(request)

# 读取返回结果
result = response.read()

# 写入文件
with open('baidu.html','wb') as f:
    f.write(result)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
获取返回响应的数据
当获取响应的response对象时,我们可以获取响应码,响应体等信息,如:

# 获取响应码
response.getcode()

# 获取请求的url
response.geturl()

# 获取响应头信息
response.info()
1
2
3
4
5
6
7
8
quote()与unquote()
在url的get请求,url会有中文的问题,这时的中文需要转码成urlencode编码。我们需要通过quote()处理中文字符的问题。

# 将中文转成urlencode编码
result = urllib.request.quote('薛之谦')

# 输出,结果:%E8%96%9B%E4%B9%8B%E8%B0%A6
print(result)

# 将urlencode编码的数据,进行解码
result = urllib.request.unquote('%E8%96%9B%E4%B9%8B%E8%B0%A6')

# 输出,结果:薛之谦
print(result)
1
2
3
4
5
6
7
8
9
10
11
12
一个简单的Python爬虫示例

该爬虫爬取的网站是百度贴吧。具体入下:

创建一个tieba.py的文件,代码如下:

#!/usr/bin/env python
# encoding: utf-8

import urllib.request


def load_page(request):
    """
    加载网络的页面信息
    :param request: 请求参数
    :return:返回服务端的响应信息
    """
    return urllib.request.urlopen(request)


def write_page(response, filename):
    """
    将响应返回的信息,写入文件保存
    :param response:服务器返回的响应信息
    :param filename:保存的文件名
    :return:
    """
    content = response.read()
    with open(filename, 'wb') as f:
        f.write(content)


def spider(url, headers, startPage, endPage):
    """
    爬取网页的方法
    :param url: 请求的url
    :param headers:自定义的请求头信息
    :param startPage:请求的开始页面
    :param endPage:请求的结束页面
    :return:
    """
    for page in range(startPage, endPage + 1):
        page = (page - 1) * 50
        # 通过研究页面的规律,拼接需要请求的完整url
        fullUrl = url + '&pn=' + str(page)
        print(fullUrl)
        # 获取请求对象
        request = urllib.request.Request(fullUrl, headers=headers)
        # 加载页面,返回服务端的响应
        response = load_page(request)
        # 拼接文件名
        filename = '第' + str(int(page / 50 + 1)) + "页.html"
        # 写入文件
        write_page(response, filename)


if __name__ == '__main__':
    # 百度贴吧的url
    url = 'https://tieba.baidu.com/f?'
    # 防止ip被禁,重新指定User-Agent字段信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
    # 通过输入关键字查询
    keyword = input('请输入关键字:')
    # 输入的文字(如:中文)进行urlencode编码
    keyword = urllib.request.quote(keyword)
    # 拼接url
    fullUrl = url + "kw=" + keyword
    # 输入起始页
    startPage = int(input("输入起始页:"))
    # 输入结束页
    endPage = int(input('输入结束页:'))
    # 开始抓取页面
    spider(fullUrl, headers, startPage, endPage)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
运行tieba.py文件,在控制台会让你输入:请输入关键字:等。如图:


---------------------
【转载】
作者:张行之
来源:CSDN
原文:https://blog.csdn.net/qq_33689414/article/details/78479279
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马