4.2 urllib.parse
4.2.1 url编码与解码
url 只能由特定的字符组成(字母、数字、下划线)。如果出现其他的字符,比如¥、空格、中文等,就要对其进行编码,否则是无法发送请求的。
urllib.parse.unquote 为url解码函数,将url中非字母、数字、下划线的utf8编码%XXX 解码为相对于的字符。
urllib.parse.quote 为url编码函数,将非字母、数字、下划线转化为其所对应的utf8编码,形式为%XXX。
示例代码
我们使用的链接常会含有中文,比如:“https://segmentfault.com/sear...”,像这种链接需要对其进行编码才可以发送请求。
import urllib.parse
url = 'https://segmentfault.com/search?q=markdown%E8%AF%AD%E6%B3%95'
unencd=urllib.parse.unquote(url)
print(unencd)
encd=urllib.parse.quote(unencd)
print(encd)
输出为:
https://segmentfault.com/search?q=markdown语法
https%3A//segmentfault.com/search%3Fq%3Dmarkdown%E8%AF%AD%E6%B3%95
4.2.2 参数拼接
url里面往往需要传递参数,爬取网页时就需要将这些参数拼接成特定的格式,并且将部分非字母、数字、下划线转成相应的编码。
urllib .parse.urlencode 将参数拼接为query_string,并且将非字母、数字、下划线转成相应的编码。
示例代码
data={'name':'小A','age':'15','sex':'男'}
query_string=urllib .parse.urlencode(data)
print(query_string)
输出为:
name=%E5%B0%8FA&age=15&sex=%E7%94%B7
5.get方式
示例代码
import urllib.request
import urllib.parse
word = input('请输入你想输入的内容:')
url = 'http://www.baidu.com/s?'#写成https就获取不了,不知道为什么
data ={'ie':'utf-8',
'wd':word}
query_string = urllib.parse.urlencode(data)
url += query_string
response = urllib.request.urlopen(url)
filename=word+'.html'
with open(filename,'wb') as fp:
fp.write(response.read())
爬取的结果为一个html文件。
请输入你想输入的内容:中国
6.伪装UA
如果不对爬虫进行伪装,可能会被网站反爬。比如下面这段代码,没有伪装自己,可以很清楚的看出来这个请求是爬虫所为。
示例代码
import urllib.request
import urllib.parse
url = 'http://www.baidu.com/'#最后一个/不能省,否则就不是完整的url。可能会出现 HTTP Error 400: Bad Request
response = urllib.request.urlopen(url)
print(response.read().decode())
运行程序前打开Fiddler,抓取这次请求。从抓包的结果可以知道,请求头里的UA(User-Agent)为:Python-urllib/3.6。这很容易被对方侦测到,而被反爬。
UA可以从Fiddler抓取的包里轻松获取,所以可以用正常请求的UA代替爬虫的UA,从而进行伪装。
伪装后的爬虫示例代码
import urllib.request
import urllib.parse
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/76.0.3809.132 Safari/537.36'}
url = 'http://www.baidu.com/'#最后一个/不能省,否则就不是完整的url。可能会出现 HTTP Error 400: Bad Request
request = urllib.request.Request(url, headers = headers)
response = urllib.request.urlopen(request)
print(response.read().decode())
从Fiddler里可以看出这时请求头信息已经被伪装为正常的浏览器了。
----今天到此结束2019.11.14.17----
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。