在Python3.x中,urllib包下有四个模块分别是
- urllib.request(python2.x的urllib2),打开和读取urls
- urllib.error,包含了urllib.request所抛出的异常
- urllib.parse,解析urls
- urllib.robotparser,解析robots.txt文件
1、urllib.parse.urlencode()
- 使用urllib.parse的urlencode()函数,帮我们将key:value这样的键值对转换成key=value这样的字符串,解码工作可以使用urllib.parse的unquote()函数
- 一般HTTP请求提交数据,需要编码成URL编码格式,然后作为URL的一部分,或者作为参数传到urllib.request.Request对象中。
#/usr/bin/env python3
#-*- utf8 -*-
from urllib import request, parse
word = {'ljs':"李建生"}
# 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受
encode = parse.urlencode(word)
print(encode)
# 通过urllib.unquote()方法,把URL编码字符串,转换为原始字符串
print(parse.unquote("ljs=%E6%9D%8E%E5%BB%BA%E7%94%9F"))
#ljs=%E6%9D%8E%E5%BB%BA%E7%94%9F
#ljs=李建生
Get方式
- Get请求一般用于我们向服务器获取数据,比如说,我们用百度搜索王菊
image.png - 可以看到浏览器的url跳转到 https://www.baidu.com/s?wd=王菊,后面还有一大串,我们可以选择复制浏览器的,也可以f12,然后复制红色框里的,都一样,浏览器显示的是王菊,但是复制了之后是编码后的。可以看到http://www.baidu.com/s之后就会出现一大串,其中就包括我们要搜索的王菊
image.png
https://www.baidu.com/s?wd=%E7%8E%8B%E8%8F%8A&rsv_spt=1&rsv_iqid=0xb5506d1e00018681&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&oq=%25E7%258E%258B%25E8%258F%258A&rsv_t=76c5iEe0sNG%2F7ghbj2%2B9%2FiRWb4Mz2vab6PycV4g33SQf2TehbSOJ105%2FDBFBm6qT4UR%2F&rsv_pq=ef586b1600016dd0
- 我们尝试使用默认的Get方式来发送请求
#/usr/bin/env python3
#-*- utf8 -*-
from urllib import request, parse
url = 'http://www.baidu.com/s'
word = {'wj':'王菊'}
word = parse.urlencode(word) # 转换成url编码格式
newurl = url + '?' + word
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'}
req = request.Request(newurl, headers=headers)
res = request.urlopen(req)
print(res.read())
- 输出就不贴,一堆而且网不好好久才出来,差点卡死在那里。
批量爬取贴吧网页数据
浏览器输入一个百度贴吧的地址,比如:
百度贴吧LOL吧第一页:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
第二页:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
第三页:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100
- 可以发现规律,贴吧中每个页面不同之处就是url最后的pn的值,其余都是一样的,我们可以抓住这个规律。写一个小爬虫程序,爬取LOL贴吧的所有网页
网友评论