数据解析
。pip install bs4 # BeautifulSoup
# 使用BeautifulSoup的模块的时候需要导入模块
from bs4 import BeautifulSoup
bs4
:find
,另一个是find_all
, 从名字上看. 一个是查找一个
, 另一个是查找所有
.列表
)相同的参数
结构. 学一个即可# 伪代码
find(标签, attrs={属性:值})
'''
需求:爬取网站上的桌面壁纸(点进去后的高清壁纸)
需要点击图片下面的文字(超链接) -> 进入到子页面中获取图片下载地址
'''
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin # 专门用于网站路径拼接
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
def get_source(url):
resp = requests.get(url, headers=headers)
resp.encoding = 'gb2312'
return resp.text
def data_parse(resp):
# 直接把页面源代码塞进去,html.parser是html解析器
main_page = BeautifulSoup(resp, 'html.parser')
# 观察页面源代码可以发现,需要的数据全在ul标签下,所以先定位到ul
# 需要注意的是class='pic-list2 clearfix',选择class中其中一个就可以了
ul = main_page.find('ul', attrs={'class': 'clearfix'})
# 拿到所有的a标签(其中包含超链接)
# findall返回的是一个列表
a = ul.find_all('a', attrs={'class': 'pic'})
return a
def download_img(a, url):
# 1. 首先需要获取到每个a中的href值
# 想要从bs4里面拿到某一个标签的某一个属性 用get
for i in a:
# i.text # 获取i
# 标签中间的文字
href = i.get('href')
# print(href)
# 前面两个href是以exe结尾的,是网站携带的网站,所以需要去掉
if href.endswith('exe'):
continue
# 拼接url,获取到真正的url
href = urljoin(url, href)
child_resp = requests.get(href, headers=headers)
child_page = BeautifulSoup(child_resp.text, 'html.parser')
src = child_page.find('img', attrs={'id': 'bigImg'}).get('src')
# print(src)
resp_img = requests.get(src, headers=headers)
file_name = src.split('/')[-1]
file_path = f'练习/{file_name}'
# 下载图片
with open(file_path, mode='wb') as f:
f.write(resp_img.content)
print(f'{file_name}下载成功!!!')
if __name__ == '__main__':
url = 'https://desk.zol.com.cn/pc/'
# 1. 获取页面源代码
resp = get_source(url)
# 2. 数据解析
a = data_parse(resp)
# 3. 通过子链接下载图片
download_img(a, url)
关于选择器
. 这里我们讲两个功能
select_one
(选择器) 使用选择器
获取html文档中的标签, 拿一个select
(选择器) 使用选择器
获取html文档中的标签, 拿一堆'''需求:和01一样'''
import requests
from bs4 import BeautifulSoup
url = 'https://desk.zol.com.cn/pc/'
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
resp = requests.get(url, headers)
resp.encoding = 'gbk'
main_page = BeautifulSoup(resp.text,'html.parser')
# main_page.select(css选择器) # 选一堆
# main_page.select_ont(css选择器) # 选一个
# 根本目标:拿到每个详情页的url地址 -> a
a_list = main_page.select(".photo-list-padding > a")
for a in a_list:
href = a.get('href')
print(href)
应用场景
在xml
或者svg
文本中,解析数据比其他两个解析方法方便xpath
一样,也是需要先解析页面源代码
bs4
中只需要记住两个操作就够 find()和find_all()bs4
中拿属性
-> 标签名.get
(属性名) -> a.get(href)
-> 在超链接中获取子url
地址bs4
中获取text文本
-> 标签名.text