urllib库的使用
GET请求
首先,获取网页源码需要模拟浏览器的访问行为对网页进行请求,即使用urllopen打开对应的请求,而请求需要定制一个请求对象,该对象需要统一资源定位器url和请求头headers进行构造,headers可查询浏览器数据,url可使用基础的url和查询参数字典的拼接实现。在这个过程中,data是需要使用parse.urlencode()方法进行编码的。
通过get请求爬取网页数据分为以下几步:
- 获取网页的url,如"http://www.baidu.com/s?"
- 获取请求头headers,如{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"}
- 获取所需的查询关键字,如查询“北京”,应当以字典形式或字符串拼接形式输入,如data={'wd':'北京'}
- 将data字典数据进行编码,使用urllib.parse.urlencode(data)进行拼接
- 直接拼接url字符串和data字典:url=url+data
- 定制请求对象:请求对象需要资源定位标识符url和headers请求头,通过urllib.request.Request(url=url,headers=headers)建立Request对象
- 利用Request对象进行查询:response=urllib.request.urlopen(request)
- 读取内容并解码,content=response.read().decode('utf-8')
详细代码如下:
python">import urllib.request
import urllib.parse'''
——————request|-url|-headers|-quote
'''#Base URL
url='http://www.baidu.com/s?'#User Agent
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
}#Unicode form of the quote
data={'wd':'北京','time':'2025'#this parameter is just showing what should we do is parameters is better than one
}
new_data=urllib.parse.urlencode(data)
url=url+new_data#Make a request object
request=urllib.request.Request(url=url,headers=headers)#Simulate the brower send request to the server
response = urllib.request.urlopen(request)#Get the html code from response page
content = response.read().decode('utf-8')print(content)
POST请求
post请求需要用户提供参数,发送参数进行查询,而不能直接将编码后的data和url进行拼接。
下面以百度翻译为例进行展示,首先,需要将data进一步编码为utf-8格式,然后使用这一data构造请求对象Request。由于返回的是json数据,需要将string进一步转换为json。
python">import urllib.request
import urllib.parse
import jsonbase_url='https://fanyi.baidu.com/sug'
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
}
data={'kw':'prior'
}#Post (Must be encoded)
new_data=urllib.parse.urlencode(data).encode('utf-8')#args of post should put in the Request constructor
request=urllib.request.Request(url=base_url,data=new_data,headers=headers)
response=urllib.request.urlopen(request)
content=response.read().decode('utf-8')obj=json.loads(content)
print(obj)