声明:本文只做学习使用,禁止用作非法途径,一切因为爬虫技术使用不当造成的不良后果皆与本人无关
需要用到的库和模块
- requests库
- lxml库下的etree模块
- requests库下的RequestException类
要获取的信息
网站 http://www.aixiawx.com
首先我们要确定要得到什么数据
- 小说的名字、作者名、小说分类
- 第几章
- 每章节的内容
主要步骤
(一)构建请求头
headers = {
'User-Agent': '****************',#可填入自己的
}
base_url = 'http://www.aixiawx.com/27/27010/'
(二)分析URL参数规律
随便打开一个小说的章节,由此可见这个url参数是递增的是吧。
但是最开始的时候我观察到在这里的url是有递增规律的,就没有多看几眼,然后使用了遍历就发生了Error。
最终我测试发现部分章节不符合规律,所以不能使用这个方法来遍历url。
这样怎么办呢?
在目录页面拥有所有章节的url链接
可以抓取章节页面的url使之形成一个列表,然后遍历该列表,即可获取每个章节的链接
- 目录页面分析
根据章节的数量判断,<dd>标签一个是最合适的选择标签,所以我们使用<dd>标签来做获取章节链接的顶级索引
代码如下:
def analysis_catalogue(catalogue_html: "目录HTML文档"):
'''
解析目录HTMl文档
获取小说章节链接
对章节链接排序
'''
html = etree.HTML(catalogue_html)
contentds = html.xpath('//dd[position()>9]/a/@href')
for contentd in contentds:
yield contentd
contentus = html.xpath('//dd[position()<10]/a/@href')
for contentu in contentus:
yield contentu
收集小说的其他信息则比较简单,我们可直接通过属性索引
代码如下:
def analysis_get_file_name(catalogue_data: "目录HTML文档"):
'''
获取信息:
书名
作者名
类型
整理文件名:file_name
'''
html = etree.HTML(catalogue_data)
name_rules = [
'//meta[@property="og:novel:category"]/@content',
'//meta[@property="og:novel:author"]/@content',
'//meta[@property="og:novel:book_name"]/@content',
]
file_name = ''
for name_rule in name_rules:
content = html.xpath(name_rule)
print(content)
file_name = file_name + '#' + ''.join(content)
file_name