通过bs4模块爬取小说。
注意:bs4只能用在python中
'''
古诗词网爬取《西游记》
bs4这种解析方式只能用在python中
实例化soup对象的两种方法:
1. 本地文件
fp=open(' ','lxml') 把赋值成功的fp扔进汤里
soup=BeautifulSoup(fp,'html)
2. 网络文件:
soup = BeautifulSoup(page_text, 'lxml')
'''
from bs4 import BeautifulSoup
import requests
# 要爬取的小说主页
url='https://www.shicimingju.com/book/xiyouji.html'
headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36' }
# 用.content.decode()方法,用.text属性可能出现乱码
page_text=requests.get(url,headers=headers).content.decode()
# 通过美丽汤来解析主页里【每章节的标题】和【每个章节的url]
soup1=BeautifulSoup(page_text,'lxml')
# 通过分析发现,a标签里的text文本内容就是每个章节的标题。a标签里的href属性就是每个章节的url。
# 可以采用select方法的层级选择器拿到所有的li标签下的a标签
# 注意类选择器前面要打一个点.
tag_a_list=soup1.select('.book-mulu>ul>li>a')
print(tag_a_list) #返回一个a标签的列表
# 注意这一步不要写进for循环里面了,不然要反复打开文件。
f=open('西游记.txt','w',encoding='utf-8')
#遍历[a标签]列表
for a in tag_a_list:
title=a.text #获取a标签里的文本
# 获取a标签中href对应的属性值,拼接起来
chapter_url='https://www.shicimingju.com/'+a['href']
chapter_content=requests.get(chapter_url,headers=headers).content.decode()
soup2=BeautifulSoup(chapter_content,'lxml')
# 找到章节内容对应的标签
div_tag=soup2.find('div',class_='chapter_content')
content=div_tag.text
f.write(title+':'+content+'n') #每个章节的内容写完了就换行
print(title,'爬取完毕!')
知识点总结:
- 通过get方法发送请求后,用.content.decode( )方法避免乱码
- soup.find('标签名', class_=' ')和soup.select( ) 方法来定位标签。select方法可以按层级一层一层找
- select( )方法返回的是一个列表,里面装着要定位的标签。这里不能直接.text,不然会报错No attribute 'text',没有text这个属性。要遍历,一个一个拿出a标签,才可以用.text属性。
- f=open('西游记.txt','w',encoding='utf-8') ,这一步不要写进for循环里面了,不然要反复打开文件。