一个HTTP操作称为一个事物,其执行过程分为4个步骤:
urllib是URL和lib(library)单词组成。实际上是一个包,里面共有4个模块。
URL的一般格式为(带方括号[]的为可选项):protocol://hostname[port]/path/[; parameters] [?query]#fragment。
URL由以下三部分组成:
在urllib模块中使用urllib.request.urlopen()函数访问网页,参数为:
urllib.request.urlopen(url,data = None,[timeout,]*,cafile = None,capath = None,cadefault = False,context = None)
例:使用urllib访问目标网页。
import urllib.request
response = urllib.request.urlopen("http://www.jd.com")
html = response.read()
html = html.decode("utf-8") #还原为带中文的HTML代码,对UTF-8编码的bytes对象解码
print(html)
例:使用urllib获取响应信息。
import urllib.request
url = "http://www.baidu.com/"
response = urllib.request.urlopen(url)
print(response.getcode()) #获取当前网页的状态码:200表示网页正常、403表示不正常、404表示失败等。
print(response.geturl()) #获取当前网页的网址
print(response.getheaders()) #返回一个包含服务器响应HTTP所发送的标头
Requests是一个基于urllib,采用Apache2 Licensed开源协议的HTTP库。比url方便。
提供的功能包括:keep-alive、连接池、cookie持久化、内容自动解压、HTTP代理、SSL认证、连接超时、Session等很多特性。
例:使用GET方式抓取网页数据。
import requests
url = "http://www.baidu.com"
strhtml = requests.get(url) #将获取的数据保存到strhtml变量中
print(strhtml.text) #打印网页源码
例:使用GET方式读取网页数据,并设置超时反应。
import requests
r = requests.get("https://www.163.com/",timeout = 1)
#timeout并不是整个下载响应的时间限制,而是如果服务器在timeout秒内没有应答,将会引发一个异常。
print(r.status_code)
例:使用Requests库抓取网页图片。
import requests
r3 = requests.get("https://image11.m1905.cn/uploadfile/2021/0323/20210323100410246713.jpg")
with open('C:/Users/14553/Documents/python-spyder/xuanyazhishang.png','wb') as f:
f.write(r3.content)
import requests
from bs4 import BeautifulSoup #解析网页数据
import time #sleep方法可以让程序暂停
import json
headers = {
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51'
} #开发者工具中的user-agent
def get_info(url):
wb_data = requests.get(url,headers = headers)
soup = BeautifulSoup(wb_data.text,'lxml')
ranks = soup.select('span.pc_temp_num')
titles = soup.select('div.pc_temp_songlist>ul>li>a')
times = soup.select('span.pc_temp_tips_r>span')
for rank,title,time in zip(ranks,titles,times):
with open('C:/Users/14553/Documents/python-spyder/rank-singer.txt','wb') as f:
data = {
'rank':rank.get_text().strip(),
'singer':title.get_text().split('-')[0],
'song':title.get_text().split('-')[1], #通过split获取歌手和歌曲的信息
'time':time.get_text().strip()
}
print(data) #获取内容按字典格式打印
f.write(json.dumps(data).encode())
if __name__ == '__main__':
urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1,24)]
for url in urls:
get_info(url)
time.sleep(1) #睡眠1s