Python爬虫学习实战

前期回顾

Python爬虫学习之requests
Python爬虫学习之数据提取(XPath)
Python爬虫学习之数据提取(Beautiful Soup)

概述

在学习了requests库,以及对网页数据提取之后,就可以愉快的从网上爬取需要的资源啦!本期目的在于从某阁爬取小说,完成python爬虫实战操作。主要目标为爬取小说网站的主页小说,包括小说名字,小说链接,小说作者、小说介绍、目录以及小说内容等。

技术要求

  • requests库的基本使用
  • XPath数据提取的基本使用

实战

网页分析与数据提取

打开小说网站,并按下F12打开开发者工具。选择Elements元素,页面显示如下。
在这里插入图片描述
我们可以使用如下功能快速的查看元素所在位置。
在这里插入图片描述
可以看到本周热度推荐的书籍,都在h4标签附近。
在这里插入图片描述
其中小说名字在h4节点下的a节点内,小说链接是a节点的href属性值。小说作者信息在h4节点的兄弟节点small节点内,小说介绍在h4节点的兄弟节点p节点内。如此我们可以根据这种情况来获取小说的书名,链接,作者以及介绍等信息。代码如下:

import requests
from lxml import etree


book_list = []
base_url = 'http://www.biqugei.net/'
res = requests.get(base_url)

html = etree.HTML(res.text)

# 本周热读推荐
h4s = html.xpath('//h4')
for h4 in h4s:
    book = {}
    book_name = h4.xpath('a/text()')[0]
    book_url = h4.xpath('a/@href')[0]
    author = h4.xpath('../small/text()')[0]
    book_info = h4.xpath('../p/text()')[0]
    book['name'] = book_name
    book['url'] = base_url + book_url  # 拼接完整url
    book['author'] = author
    book['info'] = book_info
    book_list.append(book)

print(book_list)

运行结果如下所示:

[{'name': '巨甜!我在禁欲冷王的怀里恃宠而骄', 'url': 'http://www.biqugei.net//page/detail825.html', 'author': '浩瀚之渊', 'info': '一场事故,让恶名昭昭的医学博士江云缨穿到了相府又丑又哑的嫡女身上,开局就是与人偷腥?满级邪恶大佬华丽登场,不做柔弱小白花,谁来惹她,个个反杀!什么?渣爹要把她嫁给克妻的痴傻璃王,双腿残疾还不能人道?完美!药死他是不是可以妻承夫业?于是江云缨带着小算盘当上人人同情的璃王妃,摇身成了京都第一美人,还一边风风火火搞事业。开连锁医馆,建最大商会,立暗杀组织,各方势力纷纷栽在她手里,她还直呼不刺激!被甩满脸'}, {'name': '穿越无限之旅', 'url': 'http://www.biqugei.net//page/detail131077.html', 'author': '神人无名', 'info': '金庸武侠中有不少绝世高手,书中有提及名字的,也有不曾提及名字的,但都是拥有自己独有的绝世武功而名动天下。段誉有六脉神剑,欧阳锋有蛤蟆功,林朝英有玉女素心剑法,..'}, {'name': '皇家的和尚', 'url': 'http://www.biqugei.net//page/detail65541.html', 'author': '蓅謃', 'info': '冯小宝穿越了,竟然变成了名副其实的花和尚。别人穿越都是带着王霸之气,他却只想如何活下去!大唐高宗年间,那是一个多姿多彩的时代,既有威震天下的名臣武将,李靖,长..'}, {'name': '此情惟你独钟', 'url': 'http://www.biqugei.net//page/detail1038.html', 'author': '阮白', 'info': '定好的试管婴儿,突然变成了要跟那个男人同床怀孕,一夜缠绵,她被折磨的浑身瘫软!慕少凌,慕家高高在上的继承人,沉稳矜贵,冷厉霸道,这世上的事,只有他不想办的,没..'}, {'name': '上门狂婿', 'url': 'http://www.biqugei.net//page/detail860.html', 'author': '狼叔当道', 'info': ' 入赘三年,受尽羞辱;扫墓归来,开启逆袭之路!'}, {'name': '神宠又给我开挂了', 'url': 'http://www.biqugei.net//page/detail1292.html', 'author': '石三', 'info': '万古八荒第一神挂!上溯三层世界,最巅峰律令!……三年前,天空坠落三个生灵。西岭秦王得其一,横扫六国统一西岭。南荒大周武曌得其一,纵横南荒十九教,登顶第一。孙长..'}]

在这里,我们先使用XPath获取所有的h4节点,然后遍历每一个节点获取小说信息。对于小说名称以及小说链接,我们通过h4节点下的a节点获取。利用text()获取文本内容,@href获取href属性值。之后对于小说作者以及小说介绍,由于其所在节点是h4的兄弟节点,所以我们先通过..来获取父亲节点,再使用/来获取子节点,最后通过text(),获取文本内容。最后将其保存在列表,输出如上结果。

对于本周热读精选下面的分类部分的小说,其元素结果如下所示:
在这里插入图片描述
从图中可以看到,所有的分类小说,都在class属性含有panel以及panel-default的div节点下的ul节点内。
我们首先通过XPath来获取ul标签,代码如下:

divs = html.xpath('//div[contains(@class, "panel") and contains(@class, "panel-default")]/ul')
print(divs)
[<Element ul at 0x24aa71c57c8>, <Element ul at 0x24aa71c5ac8>, <Element ul at 0x24aa71c5b08>, <Element ul at 0x24aa71c5b48>, <Element ul at 0x24aa71c5b88>, <Element ul at 0x24aa71c5c08>]

可以从结果看到获取到了符合条件的ul元素。
之后我们需要获取ul节点下的li节点。

for ul in divs:
    lis = ul.xpath('li')
[<Element li at 0x2ab548f4d88>, <Element li at 0x2ab548f4dc8>, <Element li at 0x2ab548f4e08>, <Element li at 0x2ab548f4e48>, <Element li at 0x2ab548f4e88>, <Element li at 0x2ab548f4f08>, <Element li at 0x2ab548f4f48>, <Element li at 0x2ab548f4f88>, <Element li at 0x2ab548f4fc8>, <Element li at 0x2ab548f4ec8>]
[<Element li at 0x2ab549052c8>, <Element li at 0x2ab54905308>, <Element li at 0x2ab54905348>, <Element li at 0x2ab54905388>, <Element li at 0x2ab549053c8>, <Element li at 0x2ab54905448>, <Element li at 0x2ab54905488>, <Element li at 0x2ab549054c8>, <Element li at 0x2ab54905508>, <Element li at 0x2ab54905408>]
[<Element li at 0x2ab54905048>, <Element li at 0x2ab54905088>, <Element li at 0x2ab549050c8>, <Element li at 0x2ab54905108>, <Element li at 0x2ab54905148>, <Element li at 0x2ab549051c8>, <Element li at 0x2ab54905248>, <Element li at 0x2ab54905208>, <Element li at 0x2ab54905288>, <Element li at 0x2ab54905188>]
[<Element li at 0x2ab549052c8>, <Element li at 0x2ab54905308>, <Element li at 0x2ab54905348>, <Element li at 0x2ab54905388>, <Element li at 0x2ab549053c8>, <Element li at 0x2ab54905488>, <Element li at 0x2ab549054c8>, <Element li at 0x2ab54905508>, <Element li at 0x2ab54905408>, <Element li at 0x2ab54905448>]
[<Element li at 0x2ab54905048>, <Element li at 0x2ab54905088>, <Element li at 0x2ab549050c8>, <Element li at 0x2ab54905108>, <Element li at 0x2ab54905148>, <Element li at 0x2ab54905248>, <Element li at 0x2ab54905208>, <Element li at 0x2ab54905288>, <Element li at 0x2ab54905188>, <Element li at 0x2ab549051c8>]
[<Element li at 0x2ab549052c8>, <Element li at 0x2ab54905308>, <Element li at 0x2ab54905348>, <Element li at 0x2ab54905388>, <Element li at 0x2ab549053c8>, <Element li at 0x2ab549054c8>, <Element li at 0x2ab54905508>, <Element li at 0x2ab54905408>, <Element li at 0x2ab54905448>, <Element li at 0x2ab54905488>]

现在我们已经获取了所有包含小说名称,链接以及作者的li节点,接下来,我们需要分析每一个li节点,以便于我们提取需要的数据。
在这里插入图片描述
从图中可以看到,小说名字在li节点下的a节点内,小说链接是a节点的href标签,小说作者在li节点下span节点内。故我们可以使用以下代码提取数据。

# 分类
divs = html.xpath('//div[contains(@class, "panel") and contains(@class, "panel-default")]/ul')


for ul in divs:
    lis = ul.xpath('li')
    for li in lis:
        book = {}
        book_name = li.xpath('a/text()')[0]
        book_url = li.xpath('a/@href')[0]
        author = li.xpath('span/text()')[0]
        book['name'] = book_name
        book['url'] = base_url + book_url  # 拼接完整url
        book['author'] = author
        book_list.append(book)
        
print(book_list)
[{'name': '驭兽主宰', 'url': 'http://www.biqugei.net//page/detail165441.html', 'author': '凡炎'}, {'name': '宿命之环', 'url': 'http://www.biqugei.net//page/detail165557.html', 'author': '爱潜水的乌贼'}, {'name': '重写九九', 'url': 'http://www.biqugei.net//page/detail165482.html', 'author': '一桶布丁'}, {'name': '藏国', 'url': 'http://www.biqugei.net//page/detail165564.html', 'author': '高月'}, {'name': '那么遥远,那样明亮', 'url': 'http://www.biqugei.net//page/detail165471.html', 'author': '谢楼南'}, {'name': '无相鬼书', 'url': 'http://www.biqugei.net//page/detail165372.html', 'author': '烧饼夹盐'}, {'name': '仙在囧途:天上掉下个仙妹妹', 'url': 'http://www.biqugei.net//page/detail165426.html', 'author': '单兮'}, {'name': '梵天战帝', 'url': 'http://www.biqugei.net//page/detail165467.html', 'author': '回首离梦'}, {'name': '绝世驭鬼师:邪王,要翻身!', 'url': 'http://www.biqugei.net//page/detail165530.html', 'author': '南北火'}, {'name': '(快穿)元帅你服不服', 'url': 'http://www.biqugei.net//page/detail165470.html', 'author': '十六月西瓜'}, {'name': '爱你,是我的地老天荒', 'url': 'http://www.biqugei.net//page/detail165513.html', 'author': '叶非夜'}, {'name': '隐婚百分百:总裁,请深爱', 'url': 'http://www.biqugei.net//page/detail165520.html', 'author': '塞雪'}, {'name': '攀上董事长夫人:一号职员', 'url': 'http://www.biqugei.net//page/detail165526.html', 'author': 'SR原来'}, {'name': '禁爱军少,撩不停!', 'url': 'http://www.biqugei.net//page/detail165531.html', 'author': '米米嘉'}, {'name': '仙凡奇谭', 'url': 'http://www.biqugei.net//page/detail165546.html', 'author': '两年之后'}, {'name': '卿卿来吃', 'url': 'http://www.biqugei.net//page/detail165514.html', 'author': '意千重'}, {'name': '官梯(完整版)', 'url': 'http://www.biqugei.net//page/detail165541.html', 'author': '钓人的鱼'}, {'name': '修仙界归来', 'url': 'http://www.biqugei.net//page/detail165524.html', 'author': '扑大神'}, {'name': '幸孕甜妻:总裁好凶猛', 'url': 'http://www.biqugei.net//page/detail165534.html', 'author': '猫深深'}, {'name': '恶魔校草缠上身:吻安,公主殿下', 'url': 'http://www.biqugei.net//page/detail165529.html', 'author': '南风来'}, {'name': '最强唐僧战西游', 'url': 'http://www.biqugei.net//page/detail165439.html', 'author': '斗战圣猴'}, {'name': '极品相师', 'url': 'http://www.biqugei.net//page/detail165495.html', 'author': '萧瑟良'}, {'name': '冥主', 'url': 'http://www.biqugei.net//page/detail165463.html', 'author': '中原五百'}, {'name': '美女在上', 'url': 'http://www.biqugei.net//page/detail165499.html', 'author': '锦瑟'}, {'name': '将进酒', 'url': 'http://www.biqugei.net//page/detail165552.html', 'author': '唐酒卿'}, {'name': '楚少归来', 'url': 'http://www.biqugei.net//page/detail165548.html', 'author': '北辰本尊'}, {'name': '花都透视仙医', 'url': 'http://www.biqugei.net//page/detail165440.html', 'author': '发飙的饺子'}, {'name': '刀尖之上', 'url': 'http://www.biqugei.net//page/detail165560.html', 'author': '长风'}, {'name': '炼狱之劫', 'url': 'http://www.biqugei.net//page/detail165565.html', 'author': '逆苍天'}, {'name': '仙门第一剑', 'url': 'http://www.biqugei.net//page/detail165488.html', 'author': '秣陵别雪'}, {'name': '消费系男神', 'url': 'http://www.biqugei.net//page/detail165549.html', 'author': '起酥面包'}, {'name': '和女房东同居的日子', 'url': 'http://www.biqugei.net//page/detail165553.html', 'author': '老鼠是我'}, {'name': '有缘咖啡馆', 'url': 'http://www.biqugei.net//page/detail165510.html', 'author': '大聖王578'}, {'name': '一世魔途', 'url': 'http://www.biqugei.net//page/detail165480.html', 'author': '一缕青愁'}, {'name': '妙手神农', 'url': 'http://www.biqugei.net//page/detail165505.html', 'author': '楚昂'}, {'name': '某法师的死神', 'url': 'http://www.biqugei.net//page/detail165537.html', 'author': '认真一点'}, {'name': '火影之罪恶王冠', 'url': 'http://www.biqugei.net//page/detail165478.html', 'author': '夜月狐吟'}, {'name': '嫡策', 'url': 'http://www.biqugei.net//page/detail165556.html', 'author': '董无渊'}, {'name': '最强十二生肖', 'url': 'http://www.biqugei.net//page/detail165536.html', 'author': '不过是个小丑'}, {'name': '海贼:狂雷之灾', 'url': 'http://www.biqugei.net//page/detail165476.html', 'author': '专意'}, {'name': '妃常难宠:朕的皇后不好惹', 'url': 'http://www.biqugei.net//page/detail165425.html', 'author': '单兮'}, {'name': '不老少女:难逃君错爱', 'url': 'http://www.biqugei.net//page/detail165430.html', 'author': '梵缺'}, {'name': '我是庶子', 'url': 'http://www.biqugei.net//page/detail165539.html', 'author': '大火光'}, {'name': '腹黑冷王:娘子不太乖', 'url': 'http://www.biqugei.net//page/detail165497.html', 'author': '望月存雅'}, {'name': '拱手河山讨你欢:错为帝妻', 'url': 'http://www.biqugei.net//page/detail165424.html', 'author': '单兮'}, {'name': '爆笑兵王', 'url': 'http://www.biqugei.net//page/detail165444.html', 'author': '寒雪独立人'}, {'name': '庶族崛起', 'url': 'http://www.biqugei.net//page/detail165438.html', 'author': '淡雅的墨水'}, {'name': '捡个妖孽扛回家', 'url': 'http://www.biqugei.net//page/detail165501.html', 'author': '十月初'}, {'name': '萌宝来袭:邪王大人,跪安吧!', 'url': 'http://www.biqugei.net//page/detail165519.html', 'author': '云太后'}, {'name': '不做你的宠:御狐', 'url': 'http://www.biqugei.net//page/detail165489.html', 'author': '穆丹枫'}, {'name': '我带游戏到现实', 'url': 'http://www.biqugei.net//page/detail165344.html', 'author': '一碗熟鱼汤'}, {'name': '异界之时间行者', 'url': 'http://www.biqugei.net//page/detail164704.html', 'author': '崛起的呱呱呱'}, {'name': '控卫逐风传说', 'url': 'http://www.biqugei.net//page/detail164986.html', 'author': '缘歆'}, {'name': '网游之独步天途', 'url': 'http://www.biqugei.net//page/detail165195.html', 'author': '赤脚少年时'}, {'name': '状态掌控者', 'url': 'http://www.biqugei.net//page/detail165196.html', 'author': '镜幻烟秋'}, {'name': '异界乒乓', 'url': 'http://www.biqugei.net//page/detail164717.html', 'author': '媚影洪'}, {'name': '随身恶魔城', 'url': 'http://www.biqugei.net//page/detail165165.html', 'author': '崛起的呱呱呱'}, {'name': '英雄联盟之天下第一辅助', 'url': 'http://www.biqugei.net//page/detail165307.html', 'author': '专卖飞行符'}, {'name': '[功夫熊猫]沈王爷', 'url': 'http://www.biqugei.net//page/detail165486.html', 'author': 'SJ姣儿'}, {'name': '别碰那只安妮', 'url': 'http://www.biqugei.net//page/detail164930.html', 'author': '初阳立夏'}]

从结果看到,我们获取了分类的60本小说。

接下来我们可以继续提取最新入库以及最近更新的小说了。
在这里插入图片描述

从图中分析可知,这两部分的小说内容在table-tbody-tr节点内。但是最新入库与最近更新的tr节点的内部结构不同,所以需要分开提取,故我们可以使用如下代码提取最新入库的数据:

trs = html.xpath('//table/tbody')[0].xpath('tr')
print(trs)
# 由于数据太多这里只显示部分内容
[<Element tr at 0x17d35cb7f88>, <Element tr at 0x17d35cbb948>, <Element tr at 0x17d35cbb988>, <Element tr at 0x17d35cbb9c8> ...]

接下来分析每一个tr节点内,各数据结构。
在这里插入图片描述
从图中可以看到,每一个tr节点包含两个td节点,第一个td节点含有小说名称和小说链接,第二个td节点含有小说作者信息。提取数据代码如下:

trs = html.xpath('//table/tbody')[0].xpath('tr')
for tr in trs:
    book = {}
    book_name = tr.xpath('td/a/text()')[0]
    book_url = tr.xpath('td/a/@href')[0]
    author = tr.xpath('td/text()')[0]
    book['name'] = book_name
    book['url'] = base_url + book_url  # 拼接完整url
    book['author'] = author
    book_list.append(book)
[{'name': '重写九九', 'url': 'http://www.biqugei.net//page/detail165482.html', 'author': '一桶布丁'}, {'name': '那么遥远,那样明亮', 'url': 'http://www.biqugei.net//page/detail165471.html', 'author': '谢楼南'}, {'name': '琴绝', 'url': 'http://www.biqugei.net//page/detail165477.html', 'author': '冰天海'}, {'name': '九州云', 'url': 'http://www.biqugei.net//page/detail165383.html', 'author': '慕白先森'}, {'name': '仙在囧途:天上掉下个仙妹妹', 'url': 'http://www.biqugei.net//page/detail165426.html', 'author': '单兮'}, {'name': '国民神医', 'url': 'http://www.biqugei.net//page/detail165563.html', 'author': '步行天下'}, {'name': '太古战天诀', 'url': 'http://www.biqugei.net//page/detail165543.html', 'author': '小钱钱在哪里'}, {'name': '极品吹牛系统', 'url': 'http://www.biqugei.net//page/detail165437.html', 'author': '东门不庆'}, {'name': '梵天战帝', 'url': 'http://www.biqugei.net//page/detail165467.html', 'author': '回首离梦'}, {'name': '(快穿)元帅你服不服', 'url': 'http://www.biqugei.net//page/detail165470.html', 'author': '十六月西瓜'}, {'name': '仙凡奇谭', 'url': 'http://www.biqugei.net//page/detail165546.html', 'author': '两年之后'}, {'name': '卿卿来吃', 'url': 'http://www.biqugei.net//page/detail165514.html', 'author': '意千重'}, {'name': '网文大神在隔壁', 'url': 'http://www.biqugei.net//page/detail165538.html', 'author': 'MIZO鱼'}, {'name': '爱你,是我的地老天荒', 'url': 'http://www.biqugei.net//page/detail165513.html', 'author': '叶非夜'}, {'name': '超级修炼系统', 'url': 'http://www.biqugei.net//page/detail165525.html', 'author': '夜不醉'}, {'name': '攀上董事长夫人:一号职员', 'url': 'http://www.biqugei.net//page/detail165526.html', 'author': 'SR原来'}, {'name': '神级小医师', 'url': 'http://www.biqugei.net//page/detail165516.html', 'author': '浪子星辰'}, {'name': '幸孕甜妻:总裁好凶猛', 'url': 'http://www.biqugei.net//page/detail165534.html', 'author': '猫深深'}, {'name': '禁爱军少,撩不停!', 'url': 'http://www.biqugei.net//page/detail165531.html', 'author': '米米嘉'}, {'name': '乡村极品小仙医', 'url': 'http://www.biqugei.net//page/detail165542.html', 'author': '小迷迷仙'}, {'name': '神印王座II皓月当空', 'url': 'http://www.biqugei.net//page/detail165547.html', 'author': '唐家三少'}, {'name': '诡秘之主2宿命之环', 'url': 'http://www.biqugei.net//page/detail165550.html', 'author': '爱潜水的乌贼'}, {'name': '极品相师', 'url': 'http://www.biqugei.net//page/detail165495.html', 'author': '萧瑟良'}, {'name': '花都透视仙医', 'url': 'http://www.biqugei.net//page/detail165440.html', 'author': '发飙的饺子'}, {'name': '英雄联盟:新时代', 'url': 'http://www.biqugei.net//page/detail165555.html', 'author': '光学'}, {'name': '超级妖猴闯西游', 'url': 'http://www.biqugei.net//page/detail165521.html', 'author': '学不会的咸鱼'}, {'name': '冥主', 'url': 'http://www.biqugei.net//page/detail165463.html', 'author': '中原五百'}, {'name': '刀尖之上', 'url': 'http://www.biqugei.net//page/detail165560.html', 'author': '长风'}, {'name': '楚少归来', 'url': 'http://www.biqugei.net//page/detail165548.html', 'author': '北辰本尊'}, {'name': '神宠又给我开挂了', 'url': 'http://www.biqugei.net//page/detail1292.html', 'author': '石三'}, {'name': '有缘咖啡馆', 'url': 'http://www.biqugei.net//page/detail165510.html', 'author': '大聖王578'}, {'name': '此情惟你独钟', 'url': 'http://www.biqugei.net//page/detail1038.html', 'author': '阮白'}, {'name': '最强十二生肖', 'url': 'http://www.biqugei.net//page/detail165536.html', 'author': '不过是个小丑'}, {'name': '嫡策', 'url': 'http://www.biqugei.net//page/detail165556.html', 'author': '董无渊'}, {'name': '无极之不死印', 'url': 'http://www.biqugei.net//page/detail165483.html', 'author': '兔纸滴耳朵'}, {'name': '消费系男神', 'url': 'http://www.biqugei.net//page/detail165549.html', 'author': '起酥面包'}, {'name': '霸道灵夫好难缠', 'url': 'http://www.biqugei.net//page/detail165523.html', 'author': '陌小木'}, {'name': '佳婿', 'url': 'http://www.biqugei.net//page/detail165554.html', 'author': '夜惠美'}, {'name': '女神的终极护卫', 'url': 'http://www.biqugei.net//page/detail165551.html', 'author': '三流人'}, {'name': '海贼:狂雷之灾', 'url': 'http://www.biqugei.net//page/detail165476.html', 'author': '专意'}, {'name': '妖娆医妃:腹黑冥帝,太凶猛', 'url': 'http://www.biqugei.net//page/detail165473.html', 'author': '锦绣葵灿'}, {'name': '囧囧少女穿越:抗旨王妃', 'url': 'http://www.biqugei.net//page/detail165432.html', 'author': '东迷笛'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '我是庶子', 'url': 'http://www.biqugei.net//page/detail165539.html', 'author': '大火光'}, {'name': '不老少女:难逃君错爱', 'url': 'http://www.biqugei.net//page/detail165430.html', 'author': '梵缺'}, {'name': '推棺', 'url': 'http://www.biqugei.net//page/detail165485.html', 'author': '离人望左岸'}, {'name': '萌宝来袭:邪王大人,跪安吧!', 'url': 'http://www.biqugei.net//page/detail165519.html', 'author': '云太后'}, {'name': '拱手河山讨你欢:错为帝妻', 'url': 'http://www.biqugei.net//page/detail165424.html', 'author': '单兮'}, {'name': '烽火博物馆', 'url': 'http://www.biqugei.net//page/detail165544.html', 'author': '莫松子'}, {'name': '江山不悔', 'url': 'http://www.biqugei.net//page/detail165429.html', 'author': '丁墨'}, {'name': '随身恶魔城', 'url': 'http://www.biqugei.net//page/detail165165.html', 'author': '崛起的呱呱呱'}, {'name': '异界之时间行者', 'url': 'http://www.biqugei.net//page/detail164704.html', 'author': '崛起的呱呱呱'}, {'name': '控卫逐风传说', 'url': 'http://www.biqugei.net//page/detail164986.html', 'author': '缘歆'}, {'name': '网游之剑仙降临', 'url': 'http://www.biqugei.net//page/detail165498.html', 'author': '天空泪'}, {'name': '好莱坞之篮球魔鬼', 'url': 'http://www.biqugei.net//page/detail165208.html', 'author': '无奈的全作'}, {'name': '超自然乐园', 'url': 'http://www.biqugei.net//page/detail165378.html', 'author': '圣人模式'}, {'name': '写轮眼在学院', 'url': 'http://www.biqugei.net//page/detail165074.html', 'author': '月夜清雪'}, {'name': '网游之暗夜天下', 'url': 'http://www.biqugei.net//page/detail164693.html', 'author': '墨家荆刺'}, {'name': '异界乒乓', 'url': 'http://www.biqugei.net//page/detail164717.html', 'author': '媚影洪'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}, {'name': '全能文艺兵', 'url': 'http://www.biqugei.net//page/detail165545.html', 'author': '上允'}]

而对于最新更新部分,我们经过分析节点结构以后,可以使用以下代码获取数据(具体分析可以自己尝试哦):

trs = html.xpath('//table/tbody')[1].xpath('tr')
for tr in trs:
    book = {}
    book_name = tr.xpath('td/a/text()')[0]
    book_url = tr.xpath('td/a/@href')[0]
    author = tr.xpath('td/text()')[1]
    book['name'] = book_name
    book['url'] = base_url + book_url  # 拼接完整url
    book['author'] = author
    book_list.append(book)

print(book_list)
# 只展示部分数据
[{'name': '重写九九', 'url': 'http://www.biqugei.net//page/detail165482.html', 'author': '一桶布丁'}, {'name': '那么遥远,那样明亮', 'url': 'http://www.biqugei.net//page/detail165471.html', 'author': '谢楼南'} ... ]

小说目录提取

通过以上操作,我们已经能够获取小说的基本信息,现在我们需要通过获取的小说链接,来进一步获取小说的目录。
先看一下网页结构。
在这里插入图片描述
可以看到,该网页只展示了部分目录,但是有一个全部章节按钮,点击进去就可以看到所有的章节。在这里我们需要提取这个按钮跳转界面的url。可以使用以下代码。

res = requests.get('http://www.biqugei.net/page/detail165482.html')
html = etree.HTML(res.text)
catagory_url = html.xpath('/html/body/div[1]/div[1]/div/div/div[2]/div/a[2]/@href')
print(catagory_url)
['/catalog/165482.html']

小技巧:
对于xpath提取,我们可以在网页上直接通过元素copy功能获取xpath路径。如下图所示。
在这里插入图片描述

接下来,我们通过目录链接,进入目录,查看目录结构,并获取所有的目录。
在目录页我们发现,其只展示了50条数据。
在这里插入图片描述
通过点击下一页,并观察url,发现不同的章节对应不同的url,总的来说url由以下组成:

url = 小说目录url + page+ “.html”

那么page我们知道是从1开始,那么最大值又是多少呢?
在这里插入图片描述
从图片可以看到,page的最大值与select节点下的option的个数有关,因此我们就可以得到pageMax值。

res = requests.get('https://www.biqugei.net/catalog/165547.html')
html = etree.HTML(res.text)
pages = html.xpath('//*[@id="indexselect"]')[0].xpath('option')
pageMax = len(pages)
print(pageMax)   // 3

当然我们也可以直接获取option节点的value属性值,该值就是对应的目录url。

res = requests.get('https://www.biqugei.net/catalog/165547.html')
html = etree.HTML(res.text)
page_urls = html.xpath('//*[@id="indexselect"]')[0].xpath('option')
for page_url in page_urls:
    url = page_url.xpath('@value')[0]
    url = 'https://www.biqugei.net' + url
    print(url)
https://www.biqugei.net/catalog/165547.html
https://www.biqugei.net/catalog/165547/2.html
https://www.biqugei.net/catalog/165547/3.html

接下来就是获取每个目录页的目录了。
通过网页分析,所有的目录在dl节点下的dd节点内。
在这里插入图片描述
最终获取目录数据代码如下:

catologs = html.xpath('//dl/dd')
for catolog in catologs:
    catolog_name = catolog.xpath('a/text()')[0]
    catolog_url = 'https://www.biqugei.net/' + catolog.xpath('a/@href')[0]
    print(catolog_name, catolog_url)
引子:皓月当空 https://www.biqugei.net//read/165547/406054.html
第一章 龙当当与龙空空 https://www.biqugei.net//read/165547/406055.html
第二章 魔法圣殿 https://www.biqugei.net//read/165547/406053.html
第三章 光明庇护体质 https://www.biqugei.net//read/165547/406057.html
...

如此通过遍历所有的目录url,即可获取完整的目录了。

小说章节内容

最后,也就到了最主要的地方了,爬取小说网站,最主要的还是看小说啦!接下来就该获取目录对应的小说内容了。
在这里插入图片描述
可以从图片看到,标题在h1节点内,而文章内容在id值为booktxtdiv节点下的p节点内。

res = requests.get('https://www.biqugei.net/read/165547/406054.html')
html = etree.HTML(res.text)
title = html.xpath('//h1/text()')[0]
content = ''.join(html.xpath('//div[@id="booktxt"]/p/text()'))
引子:皓月当空
“啊——”凄厉的惨叫声在豪华古朴的房间中响起。“我不生啦——,太疼了!龙雷雷你这个杀千刀的。种一个还不行,一下给老娘种两个,疼死我了……”“老婆,加油,老婆,你是最棒的。对 ......

至此,整个小说网站基本上都已经能够爬取了,包括小说名,作者,介绍,目录以及章节内容。

总结

经过python爬虫的学习,已经可以对一些简单的网页进行爬取数据了,对于requests库以及xpath的数据提取有了更深的理解。最后附上完整的代码。
Python爬虫爬取某阁小说,课程作业,requests+xpath学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值