python爬虫案例 ---- 爬取小说

简介: python爬虫案例 ---- 爬取小说

python爬虫案例 ---- 爬取小说

一、思路和目的:
​ 之前在最开始学习爬虫的时候就看过大神写过爬取小说的案例,之前觉得非常牛逼,后来学习了爬虫,感觉还是挺简单的。好的,下面开始我们的代码之旅。

二、步骤和内容:
第一步:确认环境
​ 想要写好,首先我们需要拥有正确的环境配置。这里我采用的基础是基于selenium来写的,selenium简而言之就是模拟人类操作浏览器,这样可以比较有效的处理ajax等数据加载方式。

​ 如果没有selenium的朋友,可以自行在csdn中查找。

第二步:确认爬取的目标和基础分析:
​ 首先今天的受害者是:http://www.xbiquge.la

​ 网站截图如下:

​ 接下来的大体思路就是:使用selenium模拟输入和搜索,然后列出所有的搜索结果,然后反馈给用户,根据用户的选择打开相应的小说,然后爬取小说内容即可。

第三步:写出大体框架
1.导入模块:

导入基本模块

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from lxml import etree
import requests
import os
1
2
3
4
5
6
7
2.大体框架:

class Spider(object):

def __init__(self):
    self.driver_path = r'D:\CHROM\chrome\chromedriver.exe'
    self.options = Options()
    self.options.add_argument('--headless')
    self.options.add_argument('--disable-gpu')
    self.driver = webdriver.Chrome(executable_path=self.driver_path,options=self.options)
    
    self.base_url = 'http://www.xbiquge.la'
    self.headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
    }

def interactive(self):
    self.driver.get('http://www.xbiquge.la/')
    #我运行的时候,为了避免网速不好,休息两秒钟
    time.sleep(2)
    #搜索方法,该方法返回首页网页的html源代码
    text = self.search()
    #输出可选择书籍的列表,该方法返回的是书籍列表的url
    url_list = self.show_list(text)
    #选择合适的书籍并爬取章节
    self.spider(url_list)
    #保存至本地
    
    
    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
说明:selenium模拟浏览器,如果不指定一定的参数,模拟的过程会默认展示出来,为了减少这种情况的出现,所以加上了这三行代码:

self.options = Options()
self.options.add_argument('--headless')
self.options.add_argument('--disable-gpu')
1
2
3
3.完成搜索方法self.search():

def search(self):

    book_name = input('请输入搜索书籍的名字:')
    
    #获取输入框的input标签和搜索按钮的button标签
    search_tag = self.driver.find_element_by_name('searchkey')
    button_tag = self.driver.find_element_by_id('sss')
    #这里采用send_keys(xxxx)方法,向输入框输入内容然后点击按钮即可
    search_tag.send_keys(book_name)
    button_tag.click()
    time.sleep(1)
    #获取html源码
    text = self.driver.page_source
    #返回源码
    return text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
好的,接下来分析下如何写获取input和button代码:

首先鼠标放于此处并右击,选择检查可以得到以下图片的内容:

可以看见,这两个标签都是容易获取的,因为selenium对于input有一个专门的name方法,而button标签则有id属性,更是容易获取。因此,可以采用下面这两行获取相应的标签:

search_tag = self.driver.find_element_by_name('searchkey')
button_tag = self.driver.find_element_by_id('sss')

1
2
4.完成输出可选择书籍列表的信息函数self.show_list():

def show_list(self,text):

    #使用lxml库解析html源代码
    html = etree.HTML(text)
    #获取书籍信息
    bookNameList = html.xpath('//table//tr//td[@class="even"]//a/text()')
    bookUrlList = html.xpath('//table//tr//td[@class="even"]//a/@href')
    lastestChapterList = html.xpath('//table//tr//td[@class="odd"]//a/text()')
    authorList = html.xpath('//table//tr//td[@class="even"]/text()')
    updateDateList = html.xpath('//table//tr//td[@align="center"]/text()')
    #输出书籍信息
    for name,author,chapter,date in zip(bookNameList,authorList,lastestChapterList,updateDateList):
        info = '''

name : {bookName}
author : {authorName}
chapter : {chapterName}
date : {updateDate}
'''.format(bookName=name,authorName=author,chapterName=chapter,updateDate=date)

        print(('book info of %s' % name).center(80,'-'))
        print(info)
        
    #返回相应书籍对应url列表
    return bookUrlList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
好的,接下来分析下这段代码的思路:

首先,我们随意输入一本书的名字或者作者的名字(这里我以辰东为例),如下图:

接下来,我们鼠标放于此处并右击检查,可以得到下面图片的信息:

显然,上面标注的就是我们需要获取的信息。好的,下面我们只需按部就班的使用xpath(lxml中支持的语法)去获取相应信息即可,采用的以下几个语句:

获取书籍信息

bookNameList = html.xpath('//table//tr//td[@class="even"]//a/text()')
bookUrlList = html.xpath('//table//tr//td[@class="even"]//a/@href')
lastestChapterList = html.xpath('//table//tr//td[@class="odd"]//a/text()')
authorList = html.xpath('//table//tr//td[@class="even"]/text()')
updateDateList = html.xpath('//table//tr//td[@align="center"]/text()')
1
2
3
4
5
6
为了输出的美观,采用了一定手段,这里就不多赘述。下面是美化后输出的形式举例:

5.完成获取小说内容的函数 self.spider():

def spider(self,url_list):

#这里用户根据之前输出的书籍列表输入相应的数字
decision = int(input('请选择合适的书籍(输入序号,ex:1 2 3 ):'))
target_url = url_list[decision-1]

#由于该网站的反爬不是很严格,所以这里只设置了headers参数里的user-agent
response = requests.get(target_url,headers=self.headers)
text = response.content.decode('utf-8')
#这里采用lxml方法获取所有章节的url
html = etree.HTML(text)
#这里有两个辅助函数,主要是为了让代码更易读
chapter_url_list = self.spider_get_urls(html)
#爬取小说对应url的内容
self.spider_get_content(chapter_url_list)   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
好的,开始分析:

首先,我们随意打开一本辰东大神的书(这里我选择的是《圣墟》):

鼠标放于此处并右击,可得以下信息:

这里你会发现,这个网站并没有将章节分页,所以上图的所有dd标签即为所有的章节,然后我们就可以采用lxml库对于这个网页解析获取对应的url-----即self.spider_get_urls()函数

def spider_get_urls(self,html):

#获取所有的a标签里面的url链接
chapter_list = html.xpath('//div[@class="box_con"]//dl//dd/a/@href')
#对于url进行拼接为完整的url
for i in range(len(chapter_list)):
    chapter_list[i] = self.base_url + chapter_list[i]
#返回url列表
return chapter_list

1
2
3
4
5
6
7
8
这里a标签的href属性的url只有一半,如:/13/13959/5939039.html,需要我们进行拼接为完整的url。

接下来我们开始下载内容即self.spider_get_content() 函数:

def spider_get_content(self,chapter_url_list):

info_dict = {}
for url in chapter_url_list:
    #打开网页
    self.driver.get(url)
    #为避免没有加载出来,休息5秒
    time.sleep(5)
    #采用lxml库解析html网页源代码
    text  = self.driver.page_source
    html = etree.HTML(text)
    title = html.xpath('//div[@class="bookname"]/h1/text()')[0]
    content_list = html.xpath('//div[@class="box_con"]//div[@id="content"]//text()')
    #删除垃圾信息
    content_list.pop(-1)
    content_list.pop(-1)
    #开始输出结果
    result = ''
    for content in content_list:
        result+=(content.strip()+'\n')
    info_dict[title] = result
return info_dict

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
首先我们需要一章一章的下载,并且每次下载之间必须留有一定的时间间隔,避免因为短时间访问过多而被封禁,当然你可以使用ip代理或者多线程提升效率。

其次,我们容易发现,这里获取的信息并不是全都是我们需要的,其中下面的数据不是我们需要的

但是仍然能被爬取,所以我们需要将他们删除,就用到了下面代码:

因为是列表,所以删除

content_list.pop(-1)
content_list.pop(-1)
1
2
3
最后我们采用字典的方式,一个章节名(key),一个小说内容(value)的形式返回。效果如下图:

6.完成保存本地函数self.save():

def save(self,result_dict):

#创建文件夹
os.mkdir('book')
os.chdir('./book')
#保存
count = 1
for key in result_dict:
    f = open(key+'.txt','w')
    f.write(result_dict[key])
    f.close()
    print('保存完%s章' % count)
    count+=1
print('保存完毕')

1
2
3
4
5
6
7
8
9
10
11
12
13
这部分没什么好说的,大家都会。

第四步、分析总结
1.全部代码如下:

-- coding:utf-8 --

Author: 自学小白菜

'''
既然选择了前进,那每一步都要认真的去做
'''

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from lxml import etree
import requests
import os

class Spider(object):

def __init__(self):
    self.driver_path = r'D:\CHROM\chrome\chromedriver.exe'
    self.options = Options()
    self.options.add_argument('--headless')
    self.options.add_argument('--disable-gpu')
    self.driver = webdriver.Chrome(executable_path=self.driver_path,options=self.options)

    self.base_url = 'http://www.xbiquge.la'
    self.headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
    }


def interactive(self):
    self.driver.get('http://www.xbiquge.la/')
    time.sleep(2)
    #搜索
    text = self.search()
    #输出可选择列表
    url_list = self.show_list(text)
    #选择合适的书籍并爬取章节
    result_dict = self.spider(url_list)
    #保存于本地
    self.save(result_dict)

def search(self):
    book_name = input('请输入搜索书籍的名字:')

    search_tag = self.driver.find_element_by_name('searchkey')
    button_tag = self.driver.find_element_by_id('sss')
    search_tag.send_keys(book_name)
    button_tag.click()
    time.sleep(1)
    text = self.driver.page_source

    return text

def show_list(self,text):
    html = etree.HTML(text)
    bookNameList = html.xpath('//table//tr//td[@class="even"]//a/text()')
    bookUrlList = html.xpath('//table//tr//td[@class="even"]//a/@href')
    lastestChapterList = html.xpath('//table//tr//td[@class="odd"]//a/text()')
    authorList = html.xpath('//table//tr//td[@class="even"]/text()')
    updateDateList = html.xpath('//table//tr//td[@align="center"]/text()')
    for name,author,chapter,date in zip(bookNameList,authorList,lastestChapterList,updateDateList):
        info = '''

name : {bookName}
author : {authorName}
chapter : {chapterName}
date : {updateDate}
'''.format(bookName=name,authorName=author,chapterName=chapter,updateDate=date)

        print(('book info of %s' % name).center(80,'-'))
        print(info)

    return bookUrlList

def spider(self,url_list):
    decision = int(input('请选择合适的书籍(输入序号,ex:1 2 3 ):'))
    target_url = url_list[decision-1]
    response = requests.get(target_url,headers=self.headers)
    text = response.content.decode('utf-8')
    html = etree.HTML(text)
    #获取所有章节的url
    chapter_url_list = self.spider_get_urls(html)
    #爬取小说对应url的内容
    content_dict = self.spider_get_content(chapter_url_list)

    return content_dict

def spider_get_urls(self,html):
    chapter_list = html.xpath('//div[@class="box_con"]//dl//dd/a/@href')
    for i in range(len(chapter_list)):
        chapter_list[i] = self.base_url + chapter_list[i]
    return chapter_list

def spider_get_content(self,chapter_url_list):
    info_dict = {}
    for url in chapter_url_list:
        self.driver.get(url)
        time.sleep(5)
        text  = self.driver.page_source
        html = etree.HTML(text)
        title = html.xpath('//div[@class="bookname"]/h1/text()')[0]
        content_list = html.xpath('//div[@class="box_con"]//div[@id="content"]//text()')
        content_list.pop(-1)
        content_list.pop(-1)
        result = ''
        for content in content_list:
            result+=(content.strip()+'\n')

        info_dict[title] = result
        print(info_dict)
    return info_dict

def save(self,result_dict):
    #创建文件夹
    os.mkdir('book')
    os.chdir('./book')
    #保存
    count = 1
    for key in result_dict:
        f = open(key+'.txt','w')
        f.write(result_dict[key])
        f.close()
        print('保存完%s章' % count)
        count+=1
    print('保存完毕')


if name == "__main__":

spider = Spider()
spider.interactive()
目录
相关文章
|
21天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
6天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
11天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
18天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
23天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
26天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
24天前
|
数据采集 JavaScript 前端开发
Python爬虫能处理动态加载的内容吗?
Python爬虫可处理动态加载内容,主要方法包括:使用Selenium模拟浏览器行为;分析网络请求,直接请求API获取数据;利用Pyppeteer控制无头Chrome。这些方法各有优势,适用于不同场景。
|
1月前
|
数据采集 监控 搜索推荐
python爬虫的基本使用
本文介绍了Python爬虫的基本概念及其广泛应用,包括搜索引擎、数据挖掘、网络监控、舆情分析和信息聚合等领域。通过安装`urllib`和`BeautifulSoup`库,展示了如何编写简单代码实现网页数据的抓取与解析。爬虫技术在大数据时代的重要性日益凸显,为各行业提供了高效的数据获取手段。
34 1
|
1月前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
1月前
|
数据采集 JavaScript 程序员
探索CSDN博客数据:使用Python爬虫技术
本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
77 0