bs4解析库
今天来继续介绍一个爬虫的解析库,和前面说过的xpath,和正则表达式的是同样的原理,就是把所需要的信息从网页中解析出来。
我们先拿一小段代码来做一下学习,这是一段html代码,接下来需要从中找出我们所需要的文本和链接等相关信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <html lang="en"> <head> <meta charset="UTF-8" /> <title>测试bs4</title> </head> <body> <div> <p>百里守约</p> </div> <div class="song"> <p>李清照</p> <p>王安石</p> <p>苏轼</p> <p>柳宗元</p> <a href="http://www.song.com/" title="赵匡胤" target="_self"> <span>this is span</span> 宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a> <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a> <img src="http://www.baidu.com/meinv.jpg" alt="" /> </div> <div class="tang"> <ul> <li><a href="百度一下,你就知道" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li> <li><a href="网易" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li> <li><a href="126网易免费邮--你的专业电子邮" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li> <li><a href="home.sina.com" class="du">杜甫</a></li> <li><a href="Awesome Coming Soon Widget Responsive Widget" class="du">杜牧</a></li> <li><b>杜小月</b></li> <li><i>度蜜月</i></li> <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li> </ul> </div> </body> </html>
|
存储到一个文件里,然后通过打开本地文件的操作,就可以开始执行了。
前提是你得先在终端环境中安装这个库。
pip intall bs4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from bs4 import BeautifulSoup
fp = open(r"D:\BaiduNetdiskDownload\爬虫课件\爬虫课件\第三章:数据解析\test.html","r",encoding="utf-8") soup = BeautifulSoup(fp,"lxml")
print(soup.find("div",class_="song").a.text)
print(soup.select(".tang > ul > li > a")[0].text) print(soup.select(".tang > ul > li > a")[0]['href'])
|
学习完这个,我们就可以实战了, 第一个案例,获取优美图库(https://www.umeitu.com/bizhitupian/huyanbizhi)的壁纸,并下载高清大图,大图在点击图片后的详情页,所以我们需要两次请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import requests from bs4 import BeautifulSoup url ='https://www.umeitu.com/bizhitupian/huyanbizhi/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3884.400 QQBrowser/10.8.4560.400'} page_list = requests.get(url,headers = headers) page_list.encoding = "utf-8" html = page_list.text
# 列表页链接 soup = BeautifulSoup(html,"lxml") urls = soup.find_all(class_="TypeBigPics") for page_url in urls: page_url = 'https://www.umeitu.com/' + page_url.get('href') # print(url)
#获取子页面链接 page_content = requests.get(page_url,headers = headers) html1 = page_content.text soup1 = BeautifulSoup(html1,"lxml") src = soup1.find("p",align="center")
img = src.img.get('src')
# 下载图片 img_resp = requests.get(img) # print(img_resp.content) img_name =img.split("/")[-1] with open(img_name,"wb") as f: f.write(img_resp.content)
|
这里需要注意的是,第一次请求列表页,用的soup.find_all,然后再循环,第二次直接soup1.find()这样请求的就是单页面。
然后图片就下载到本地了。
除了下载图片,常见的应用还有下载文本。这次用soup.select方法下载一本小说。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
import requests from bs4 import BeautifulSoup if __name__ == "__main__": headers ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3884.400 QQBrowser/10.8.4560.400'} url = "http://www.shicimingju.com/book/sanguoyanyi.html" page_text = requests.get(url,headers = headers).text.encode("ISO-8859-1")
soup = BeautifulSoup(page_text,"lxml") li_list = soup.select(".book-mulu > ul > li") fp = open("sanguo.txt","w",encoding="utf-8") for li in li_list: title= li.a.string detail_url = "https://www.shicimingju.com/"+li.a["href"] detail_page_text = requests.get(detail_url,headers= headers).text.encode("ISO-8859-1")
detail_soup = BeautifulSoup(detail_page_text,"lxml") div_tag = detail_soup.find("div",class_ = "card bookmark-list") content = div_tag.text fp.write(title+":"+content+"\n") print(title,"爬取成功")
|
小说就下载好了。感觉这个网站是个鸡肋网站,第一段看着也不是三国呀,就当练习了,毕竟这个网站也没有做反爬。