|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
PS:我的疑问在解决方案二那里,前面只是顺带给遇到和我一样情况的小白一些解决方案
原代码:
import urllib.request
import urllib.parse
import string
def get_method_params():
url = "https://www.baidu.com/s?tn=88093251_17_hao_pg&ie=utf-8&sc=UWY3rj04n1cdnNtkPdqCmyqxTAThIjYkPHmkPWbvnjn3PHb3FhnqpA7EnHc1Fh7W5HndPWfsnjbsPj0&ssl_sample=s_88&srcqid=3243340699557307542&H123Tmp=nunew7&word="
#拼接字符串(汉字)
#python可以接受的数据
#
name ="美女"
final_url = url + name
print(final_url)
#代码发送了请求
#网址里面包含了汉字,ascii是没有汉字的,需要url转译
#将包含汉字的网址进行转译
encode_new_url = urllib.parse.quote(final_url,safe = string.printable)
print(encode_new_url)
#使用代码发送网络请求
response = urllib.request.urlopen(encode_new_url)
print(response)
data = response.read().decode()
print(data)
#保存到本地
with open("02-encode.html","w",encoding = "utf-8") as f:
f.write(data)
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-185: ordinal not in range(128)
#原因:python是解释性语言,解析器只支持 ascii只支持 0-127,即不支持中文
get_method_params()
这个程序运行后生成html文件会不断地跳转,按理说本应该跳转到百度知道一个美女的搜索页面,于是我昨天在鱼C论坛发了求助帖,得到了鱼油们的热情帮助,问题也得到了解决,但是现在又出现了一些困惑,希望路过的大神帮忙看看。
问题出现原因:百度的反爬虫机制user-agent造成的
解决方案一(本答案来源于鱼C论坛@newu):加上header
import urllib.request
import urllib.parse
import string
def get_method_params():
url = "https://www.baidu.com/s?ie=UTF-8&wd="
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36',
}
#拼接字符串(汉字)
#python可以接受的数据
#
name ="美女"
final_url = url + name
print(final_url)
#代码发送了请求
#网址里面包含了汉字,ascii是没有汉字的,需要url转译
#将包含汉字的网址进行转译
encode_new_url = urllib.parse.quote(final_url,safe = string.printable)
print(encode_new_url)
#使用代码发送网络请求
req = urllib.request.Request(encode_new_url, headers=headers) # 加个头就好了
response = urllib.request.urlopen(req)
print(response)
data = response.read().decode()
print(data)
#保存到本地
with open("02-encode.html","w",encoding = "utf-8") as f:
f.write(data)
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-185: ordinal not in range(128)
#原因:python是解释性语言,解析器只支持 ascii只支持 0-127,即不支持中文
get_method_params()
解决方案二(自己无意间尝试出来的,但是不明白具体原因,希望明白的鱼油们解惑):
将get_method_params()方法下下第一行的
url = "https://www.baidu.com/s?tn=88093251_17_hao_pg&ie=utf-8&sc=UWY3rj04n1cdnNtkPdqCmyqxTAThIjYkPHmkPWbvnjn3PHb3FhnqpA7EnHc1Fh7W5HndPWfsnjbsPj0&ssl_sample=s_88&srcqid=3243340699557307542&H123Tmp=nunew7&word="
改为
url="https://www.baidu.com/s?wd="
生成的HTML文件依然可以保证正常打开,但是这样改后,在程序执行到
response = urllib.request.urlopen(encode_new_url)
的时候,会非常地慢,但是依然可以正常生成HTML文件,并且可以正常打开,求助大神,第二种解决方案的原理是是什么?又是什么原因造成了调用urlopen()方法打开网址的时候速度十分缓慢?
了解了,我尝试了下使用
url="http://www.baidu.com/s?wd="
就是不要用baidu的SSL加密协议来请求他就可以
|
|