通过python实现对网络数据的爬取时,通常使用到urllib库,在urllib库中主要有request和parse两个模块,
urlopen
urlopen()
函数用于实现对目标url的访问,例如我们对百度网址进行访问,就可以通过下面的例子
re = request.urlopen("http://www.baidu.com")
print(re.read())
上面代码就会将百度返回的消息打印出来。在这里,为了方便查看返回的消息,我们可以通过decode("utf-8)
对返回的结果进行解码
urlretrieve
urlretrieve
函数是将返回的结果保存在文件中,urlretrieve
定义如下所示,该函数是将访问的url返回的内容保存到filename中,这里通常会批量保存图片等内容比较方便
urlretrieve(url, filename=None, reporthook=None, data=None)
urlencode
当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候,需要把一些中文甚至’/'做一下编码转换,如果不转化,则会被服务器无法认识例如我们通过百度搜索新冠状病毒关键字,通过http://www.baidu.com/s?wd=新型冠状病毒
可以查看到内容,但是,如果将网址直接使用urlopen访问时,则会出现错误UnicodeEncodeError: 'ascii' codec can't encode characters
,这是我们没有对新型冠状病毒进行编码导致百度服务器无法识别。
from urllib import request,parse
q = {"wd":"新型冠状病毒"}
url = "http://www.baidu.com/s?"
n_q = parse.urlencode(q)
print(n_q)
url = url +n_q
re = request.urlopen(url)
print(re.read())
unquote
unquote
函数是对已经编码过的字符串进行解码,和urlencode
是一对,下面的代码是对内容的编码和解码
q = {"wd":"新型冠状病毒"}
en_q = parse.urlencode(q)
print(en_q)
de_q = parse.unquote(en_q)
print(de_q)
parse_qs
urlparse
urlparse
模块主要是用于解析url中的参数,返回一个包含6个字符串项目的元组:协议、位置、路径、参数、查询、片段。
url = parse.urlparse('https://i.cnblogs.com/EditPosts.aspx?opt=1')
print(url)
输出结果如下
ParseResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', params='', query='opt=1', fragment='')
request.Request
Request类是用于模拟用户登录的,下面是通过request类在拉勾网上进行查找关于python的信息。
url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36",
"Referer":"https://www.lagou.com/jobs/list_python"
}
data = {
"first": "true",
"pn": str(1),
"kd": "python"
}
rep = request.Request(url,headers=headers,data= parse.urlencode(data).encode("utf-8"),method="PSOT")
re = request.urlopen(url)
st = re.read().decode("utf-8")
f = open("index.html","w")
count = f.write(st)
f.close()
print(st)
print(count)
但是上面的代码执行结果是,
产生上面的原因是由于拉勾网的反爬机制作祟,在下节我们将通过http.CookieJar来解决这个问题。