目录
一、爬取第一章
1.引入requests 和 parsel库
import requests
import parsel
如果requests 和 parsel报错,单击requests再按Alt+Enter,Install package requests。
单击parsel再按Alt+Enter,Install package parsel。
依然报错可以使用pip命令安装requests和parsel模块
pip install requests
pip install parsel
可以查看Python中安装了哪些第三方库
pip list
2.代码实现步骤:
(1).发送请求,对于刚刚分析得到的url地址发送请求
(2).获取数据,获收服务器返回的response响应数据
(3).解析数据,提取我们想要的数据内容小说章节名字以及小说内容
(4).保存数据,把提取出来的内容保存到本地
(1).发送请求
小说第一章导航栏地址:
用response变量接收返回的内容
url = 'http://www.ibiquge.cc/19666/5687111.html'
response= requests.get(url) # <Response[200]>返回response响应对象,200表示请求成功
print(response)
(2).获取数据
print(response.text)
(3).解析数据
提取章节名
进入开发者模式:F12,再依次点击:
使用 css 获取小说标题,粘贴:
selector = parsel.Selector(response.text)
novel_title = selector.css('.content h1 ::text').get()
print(novel_title)
使用 xpath 也可以获取小说标题
novel_title = selector.xpath('//*[@class="content"]/h1/text()').get()
提取小说内容
小说内容比较多,使用getall
novel_content = selector.css('#content::text').getall()
print(novel_content)
保存数据时不能直接对列表数据进行保存,所以把列表转换成字符串数据。
使用 \n 换行
novel_content_list = selector.css('#content::text').getall()
novel_content = '\n'.join(novel_content_list)
(4).保存数据
w写入数据但是覆盖,a写入追加写入,写入文件末尾,b二进制模式。保存文字一定要指定编码,这里用的UTF-8。
with open(novel_title + '.txt', mode='w', encoding='utf-8') as f:
f.write(novel_content)
有一个问题:小说里面没有章节名。
删除第一章的txt文件,换成以下代码:
with open(novel_title + '.txt', mode='a', encoding='utf-8') as f:
f.write(novel_title)
f.write('\n')
f.write(novel_content)
f.write('\n')
二、爬取整本小说
爬一章需要一个url,只要获取所有的章节网址就可以爬取一本了。
返回目录页
import re
设置user-agent可以模拟不同的客户端跟服务器通信,这样可以避免服务器屏蔽我们的爬虫。
url = 'http://www.ibiquge.cc/19666/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
response = requests.get(url, headers)
爬取小说所有章节
novel_name = re.findall('<h1>(.*?)</h1>', response.text)[0]
novel_info = re.findall('<dd><a href ="(.*?)">(.*?)</a></dd>', response.text)
print(novel_name)
for novel_url, novel_title in novel_info:
novel_url = 'http://www.ibiquge.cc' + novel_url
response = requests.get(novel_url, headers)
selector = parsel.Selector(response.text)
novel_content_list = selector.css('#content::text').getall()
novel_content = '\n'.join(novel_content_list)
with open(novel_name + '.txt', mode='a', encoding='utf-8') as f:
f.write(novel_title)
f.write('\n')
f.write(novel_content)
f.write('\n')
print('正在保存', novel_title)
整本小说