python爬虫(爬取三国演义小说章节标题和章节内容)+bs4数据解析

1、网页URL: http://www.shicimingju.com/book/sanguoyanyi.html在这里插入图片描述
1.1 注意安装环境
pip install bs4
pip install lxml(解析器)
1.2 数据解析原理:
1.2.1 标签定位
1.2.2 提取标签、标签属性中存储的数据值
1.3 bs4数据解析的原理:(bs4只能用于python)
1.3.1实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
1.3.2通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取。
2、在首页中解析出章节的标题和详情页的url
用F12抓包工具
在这里插入图片描述
快捷键[Ctrl+Shift+C],选择章节标题部分,会自动在Elements的源码中显示在何处,如图:
在这里插入图片描述
是在div标签下的class =book-mulu 的 ul 子标签的各个 li 子标签的 a 标签中
a标签中有章节标题和章节内容的超链接
解析出章节标题和超链接
结果如下:
在这里插入图片描述
在这里插入图片描述
知识点:
bs4
如何实例化BeautifulSoup对象
from bs4 import BeautifulSoup
1、将本地的html文档中的数据加载到该对象中
fp=open(’./test.html’,‘r’,encoding=‘uft-8’)
soup=BeautifulSoup(fp,‘lxml’)
2、将互联网上获取的页面源码加载到该对象中
page_text=response.text
soup=BeautifulSoup(page_text,‘lxml’)
提供的用于数据解析的方法和属性:
(1)根据标签名查找
- soup.a 只能找到第一个符合要求的标签
(2)获取属性
- soup.a.attrs 获取a所有的属性和属性值,返回一个字典
- soup.a.attrs[‘href’] 获取href属性
- soup.a[‘href’] 也可简写为这种形式
(3)获取内容
- soup.a.string
- soup.a.text
- soup.a.get_text()
【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
(4)find:找到第一个符合要求的标签
- soup.find(‘a’) 找到第一个符合要求的
- soup.find(‘a’, title=“xxx”)
- soup.find(‘a’, alt=“xxx”)
- soup.find(‘a’, class_=“xxx”)
- soup.find(‘a’, id=“xxx”)
(5)find_all:找到所有符合要求的标签
- soup.find_all(‘a’)
- soup.find_all([‘a’,‘b’]) 找到所有的a和b标签
- soup.find_all(‘a’, limit=2) 限制前两个
(6)根据选择器选择指定的内容
select:soup.select(’#feng’)
- 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
- 层级选择器:
div .dudu #lala .meme .xixi 下面好多级
div > p > a > .lala 只能是下面一级
【注意】select选择器返回永远是列表,需要通过下标提取指定的对象
代码如下:

import requests
from bs4 import BeautifulSoup
#对首页的页面数据进行爬取
#UA伪装
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.3741.400 QQBrowser/10.5.3863.400'
}
#指定URL
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
#发起请求
page_text = requests.get(url=url,headers=headers).text
#在首页中解析出章节的标题和详情页的url
#step1 实例化BeautifulSoup对象,需要将页面源码加载到该对象中

soup = BeautifulSoup(page_text,'lxml')
#解析章节标题和详情页url
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 ='http://www.shicimingju.com'+li.a['href']#超链接不是完整URL,需要点击超链接查看完整URL
    #对详情页发起请求,解析出章节内容
    detail_page_text = requests.get(url=detail_url,headers=headers).text
    #解析出详情页中相关的章节内容
    detail_soup = BeautifulSoup(detail_page_text,'lxml')
    div_tag = detail_soup.find('div',class_='chapter_content')
    #解析到了章节的内容
    content = div_tag.text
    fp.write(title+':'+content+'\n')
    print(title,"爬取成功!!!")

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值