爬取思路:
1.先分析网页是否通过ajax动态获取数据,刷新看页面有没有变化,发现网站非ajax动态获取数据的页面,不需要抓包,直接只用网站就可以爬取,就可以获取headers和url
2.我们可以抓取章节页面的网页源码数据,再实例化一个BeautifulSoup对象,将页面源码数据加载到该对象中
page_text =requests.get(url=url,headers=headers).text Soup=BeautifulSoup(page_text,'lxml')
得到的结果是一个网页的源码数据
3.我们的第一个目标就是先将章节名称和章节相应的内容获取到,由上面的网页源码我们可以看到这些章节内容都在一个<div class="book-mulu">的标签内
li_list=(Soup.select(".book-mulu li"))
建立一个li的列表,放入章节名字和章节内容网址,通过for遍历出来,title为章节名字,detail_url为对应章节的内容网站
4.但是我们发现detail_url的网站地址并不是详细完整的,我们可以点进去看章节网站的地址是长什么样的,与detail_url的地址对
第一章节的detail_url为
少了的部分为网站的前缀,我们可以通过"+"对detail_url进行补充,使其成为一个完整的网站
bs4中的text和get()可以获取标签内容和子标签内容
for li in li_list: title = li.a.text detail_url="http://www.shicimingju.com"+li.a.get('href')
5.完成了章节名称和章节对应网站的抓取之后,我们第二个目标是抓章节里面的内容
我们在前面已经获取了各章节对应的网站detail_url了,接下来我们需要对detail_url发送请求,获取文章内容
detail_page_text = requests.get(detail_url,headers=headers).text
重新再实例化一个soul对象,将详情页的页面源码在加载进来
detail_soup = BeautifulSoup(detail_page_text,'lxml')
同样的分析思路,实例化一个soul对象之后,我们去看网站的源码发现内容都放在一个<div class="chapter_content">的p标签内
利用bs4根据选择器选择指定的内容,定位到div的标签上,返回一个列表,在通过下标和get_text()获取标签下的所有文本内容
desc = detail_soup.select(".chapter_content")[0].get_text()
6.以上就完成了爬取三国演义的小说内容的95%的内容了,最后一步我们要将将数据写入文件中
f = open("./sanguo.txt","w",encoding="utf-8")
注意写入文件要在遍历之前打开文件,否则每次写入都要打开文件
f.write(title+":"+desc+'\n')
import requests from bs4 import BeautifulSoup url="http://www.shicimingju.com/book/sanguoyanyi.html" headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"} page_text = requests.get(url=url,headers=headers).text Soup = BeautifulSoup(page_text,'lxml') li_list = (Soup.select(".book-mulu li")) f = open("./sanguo.txt","w",encoding="utf-8") for li in li_list: title = li.a.text detail_url="http://www.shicimingju.com"+li.a.get('href') # 向详情页的URL页发送请求,获取文章内容 detail_page_text= requests.get(url=detail_url,headers=headers).text # 数据解析(重新再实例化一个soul对象,将详情页的页面源码在加载进来) detail_soup = BeautifulSoup(detail_page_text,'lxml') desc = detail_soup.select(".chapter_content")[0].get_text() # 写入文件中 f.write(title+":"+desc+'\n')爬取诗词名句网站三国演义的章节内容