Python-爬取⼩说⽂字内容(使⽤beautifulsoup实现)
Python-爬取⼩说⽂字内容(beautiful soup)
Beautiful Soup简介
官⽅解释:
Beautiful Soup提供⼀些简单的、python式的函数⽤来处理导航、搜索、修改分析树等功能。它是⼀个⼯具箱,通过解析⽂档为⽤户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出⼀个完整的应⽤程序。
Beautiful Soup⾃动将输⼊⽂档转换为Unicode编码,输出⽂档转换为utf-8编码。你不需要考虑编码⽅式,除⾮⽂档没有指定⼀个编码⽅式,这时,Beautiful Soup就不能⾃动识别编码⽅式了。然后,你仅仅需要说明⼀下原始编码⽅式就可以了。
Beautiful Soup已成为和lxml、html6lib⼀样出⾊的python解释器,为⽤户灵活地提供不同的解析策略或强劲的速度。 ——
此次实战从⽹上爬取⼩说,需要使⽤到Beautiful Soup。
Beautiful Soup为python的第三⽅库,可以帮助我们从⽹页抓取数据。
它主要有如下特点:
1.Beautiful Soup可以从⼀个HTML或者XML提取数据,它包含了简单的处理、遍历、搜索⽂档树、修改⽹页元素等功能。可以通过很简短地代码完成我们地爬⾍程序。
2.Beautiful Soup⼏乎不⽤考虑编码问题。⼀般情况下,它可以将输⼊⽂档转换为unicode编码,并且以utf-8编码⽅式输出。
对于本次爬⾍任务,只要了解以下⼏点基础内容就可以完成:
1.Beautiful Soup的对象种类:
Tag
Navigablestring
BeautifulSoup
Comment
2.遍历⽂档树:find、find_all、find_next和children
3.⼀点点HTML和CSS知识(没有也将就,现学就可以)
python正则表达式不包含
Beautiful Soup安装
在Anaconda Prompt中输⼊:
pip install beautifulsoup4
安eautiful soup。
使⽤python代码爬取
1.爬取思路分析
按F12查看⽹页的审查元素菜单,选择左上⾓[箭头]的标志,在⽬录中选择想要爬取的章节标题,如图:选择了【第六章 少司命(3)】,可以看到⽹页的源代码中,加深显⽰了本章的链接。
这样我们可以看到,每⼀章的链接地址都是有规则地存放在<li>中。⽽这些<li>⼜放在<div id=”book_detail”
class=”box1″>中。
2.单章节爬⾍
刚才已经分析过⽹页结构。我们可以直接在浏览器中打开对应章节的链接地址,然后将⽂本内容提取出来。我们要爬取的内容全都包含在这个<div>⾥⾯。
输出的结果为:
3.⼩说全集爬⾍
思路是先在⽬录页中爬取所有章节的链接地址,然后再爬取每个链接对应的⽹页中的⽂本内容。说来,就是⽐单章节爬⾍多⼀次解析过程,需要⽤到Beautiful Soup遍历⽂档树的内容。
1).解析⽬录页⾯
在思路分析中,我们已经了解了⽬录页的结构。所有的内容都放在⼀个所有的内容都放在⼀个<div id=
”book_detail” class=”box1″>中。代码整理如下:
# 爬取单章节的⽂字内容
from  urllib import  request
from  bs4 import  BeautifulSoup
if  __name__ == '__main__':
# 第6章的⽹址
url = 'www.136book/mieyuechuanheji/ewqlwb/'
head = {}
# 使⽤代理
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166  Safar
req = request.Request(url, headers = head)
response = request.urlopen(req)
html = ad()
# 创建request 对象
soup = BeautifulSoup(html, 'lxml')
# 出div 中的内容
soup_text = soup.find('div', id = 'content')
# 输出其中的⽂本
print()
输出结果为:
2).爬取全集内容
将每个解析出来的链接循环代⼊到url中解析出来,并将其中的⽂本爬取出来,并且写到本地E:/中。(存放位置可以根据⾃⼰的本地情况⾃定义)代码整理如下:
# 爬取⽬录页⾯-章节对应的⽹址
from urllib import request
from bs4 import BeautifulSoup
if  __name__ == '__main__':
# ⽬录页
url = 'www.136book/mieyuechuanheji/'
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166  Safar
req = request.Request(url, headers = head)
response = request.urlopen(req)
html = ad()
# 解析⽬录页
soup = BeautifulSoup(html, 'lxml')
# find_next 到第⼆个<div>
soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
# 遍历ol 的⼦节点,打印出章节标题和对应的链接地址
for  link in  soup_texts.ol.children:
if  link != '\n':
  + ':  ', link.a .get('href'))
# 爬取全集内容
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
url = 'www.136book/mieyuechuanheji/'
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166  Safar    req = request.Request(url, headers = head)
response = request.urlopen(req)
html = ad()
soup = BeautifulSoup(html, 'lxml')
soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
# 打开⽂件
f = open('E:/','w')
# 循环解析链接地址
for link in soup_texts.ol.children:
if link != '\n':
download_url = ('href')
download_req = request.Request(download_url, headers = head)
download_response = request.urlopen(download_req)
download_html = ad()
download_soup = BeautifulSoup(download_html, 'lxml')
download_soup_texts = download_soup.find('div', id = 'content')
# 抓取其中⽂本
download_soup_texts = download_
# 写⼊章节标题
f. + '\n\n')
# 写⼊章节内容
f.write(download_soup_texts)
f.write('\n\n')
f.close()
可以打开存放位置的⽂件:E:/ 查看爬取结果。
代码还有很多改进的地⽅。例如⽂本中包含⼴告的js代码可以去除,还可以加上爬⾍进度显⽰等等。实现这些功能需要包含正则表达式和os
模块知识,就不多说了,⼤家可以继续完善。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。