Python常见的网页请求方式总结

    在进行Python爬虫时,我们首先要向网页请求数据,拿到数据后再进行相关操作。今天我们便以代码形式,对常见的网页请求方式进行分析总结。

1. urlopen()

  首先我们先用urlopen完成一个简单的数据请求,代码如下:

from urllib.request import Request,urlopen
url = 'https://www.baidu.com/'
request = Request(url,headers=headers)
response = urlopen(request)
print(response)

运行之后得到如下结果:

这个请求数据的思路是:引入所需的工具Request和urlopen,之后用Request设置请求网页数据所必须的条件,然后就可以用urlopen()进行数据请求了。整个过程中需要注意的是Reqeest()中的两个参数,第一个参数是请求的目标url,要注意使用时观察它是否是自己的目标url、是否已经拼接完整、拼接过程中是否出现细节错误等等,如果不能保证url的正确性,则无法获取到自己想要的数据;第二个参数则是看情况进行设置,它的作用是设置请求时的User-Agent,是为了初步得将‘’程序‘’伪装成‘’自然人‘’,算是应付初步的反爬虫措施。两个参数设置正确后,使用urlopen()进行数据请求,返回的结果存于内存中,可以通过read()方法读取和decode()方法进行解码,从而得到可以进一步操作的网页的数据。

urlopen()有两个明显的缺点:

其一:url中带有中文时,不能单独用它进行数据请求,举个例子:

from urllib.request import Request,urlopen
url = 'https://www.sojson.com/open/api/weather/json.shtml?city=郑州'
request = Request(url)
response = urlopen(request)
print(response)

程序运行结果:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 38-39: ordinal not in range(128)

这里提示ASCII值报错:urlopen()不支持中英文混写,所以url中不能有中文,之所以在浏览器地址栏中能看到中文,是因为浏览器处于对用户友好的目的, 为了让用户识别更简便,特意这样显示处理后的url,但是在浏览器本身执行程序的时候,中文会被转码。所以我们编程过程中如果不利用quote()进行转码,程序会报错。在转码过程中,我们又需要注意的是,quote()会将url中的特殊字符也进行转码,为了避免出错,需要进行安全转码。 具体实现如下:

from urllib.request import Request,urlopen
from urllib.parse import quote
import string
url = 'https://www.sojson.com/open/api/weather/json.shtml?city=郑州'
response = urlopen(quote(url,safe=string.printable))
print(response)

其二:urlopen()只能进行简单的请求,不支持在线验证,cookie,代理ip等复杂操作。但是却可以通过使用build_opener()来代替urlopen(),它们用法相同。build_opener()内部实现其实就是urlopen(),不过它支持更加复杂的操作。以进行代理ip操作为例,具体实现如下:

import random
from urllib.request import Request,build_opener,ProxyHandler
url = 'http://www.baidu.com'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
ip_list = [
    '61.135.217.7:80',
    '116.62.194.248:3128',
    '118.190.95.35:9001',
    '221.228.17.172:8181'
]
proxies = {
    'http':random.choice(ip_list)
}
request = Request(url,headers=headers)
proxies_handler = ProxyHandler(proxies)
opener = build_opener(proxies_handler)
response = opener.open(request)
print(response)

2. requests()

  requests是对urllib3的封装,使用起来很方便,我们通过一段代码来说明一下:

import requests
import json
from prettyprinter import pprint
url = 'https://www.sojson.com/open/api/weather/json.shtml?city=郑州'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
response = requests.get(url,headers=headers)
code_dic = json.loads(response.content)
pprint(code_dic)

如上,我们要获取郑州天气API的数据,就要使用requests()方法设置好访问的目标url和headers,之后可以搭配json将获取到的数据转化为字典,方便之后进行操作。需要注意的是,在获取request()请求到的网页内容时,我们使用content获取到的是bytes类型的数据,也就是二进制,使用text获取到的是str字符串类型,需要根据往后的具体操作选择对应的格式进行数据获取。

你可能感兴趣的:(Python)