Python爬虫学习笔记

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文件。

请输入你想输入的内容:中国

image.png
image.png

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。这很容易被对方侦测到,而被反爬。

image.png

image.png

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里可以看出这时请求头信息已经被伪装为正常的浏览器了。

image.png

                                   ----今天到此结束2019.11.14.17----
                                      

阅读 85更新于 11月14日
推荐阅读
目录