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 etreebook_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_namebook['url'] = base_url + book_url  # 拼接完整urlbook['author'] = authorbook['info'] = book_infobook_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_namebook['url'] = base_url + book_url  # 拼接完整urlbook['author'] = authorbook_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_namebook['url'] = base_url + book_url  # 拼接完整urlbook['author'] = authorbook_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_namebook['url'] = base_url + book_url  # 拼接完整urlbook['author'] = authorbook_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' + urlprint(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学习

Python爬虫学习实战相关推荐

  1. Python网络爬虫学习实战:爬虫快速入门

    很多同学私信问爬虫的相关教程,想了想,还是专门跟大家出些Python爬虫学习相关的教程,从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬加密的网站,还有爬虫拿不到数 ...

  2. python爬虫项目-33个Python爬虫项目实战(推荐)

    今天为大家整理了32个Python爬虫项目. 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1] ...

  3. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  4. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  5. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  6. 免费python课程排行榜-Python爬虫学习排行榜

    Python作为一门高级编程语言,在编程中应用非常的广泛,近年来随着人工智能的发展Python人才的需求更大,北京Python培训班也成了很多人转行高薪行业的一个捷径.想学爬虫,Python爬虫学习排 ...

  7. Python爬虫学习手册

    like:128-Python 爬取落网音乐 like:127-[图文详解]python爬虫实战--5分钟做个图片自动下载器 like:97-用Python写一个简单的微博爬虫 like:87-爬虫抓 ...

  8. python爬虫学习 - 查看显卡价格

    python爬虫学习 - 查看显卡价格 这是一个简单的爬虫项目,用于从中关村网站上爬取显卡报价数据,后续可以考虑爬取相关的参数信息让数据更立体.数据的保存使用的是json,以python为主要开发语言 ...

  9. python爬虫初学实战——免登录爬取easyicon里的vip图标(2)

    python爬虫初学实战-免登录爬取easyicon里的vip图标(2) 实验日期:2020-08-09 tips:没看过前面(1)的可以康康,指路 -> 爬取easyicon里的png图标 成 ...

最新文章

  1. java模态_java – 如何在另一个模态JDialog之上创建一个模态的JDialog
  2. istringstream和ostringstream
  3. SpringBoot-SpringCloud-版本对应关系
  4. Ubuntu Linux系统中出现jupyter notebook不能自动打开浏览器
  5. [转贴]电视和显示器的相关语言
  6. JavaScript高级特征之面向对象笔记
  7. python字典嵌套字典的情况下获取某个key的value
  8. mysql封装增删改查_jdbc封装一行代码实现增删改查
  9. 头文件不应该含有非inline函数或对象的定义
  10. 淘宝十年数据和轶事整理
  11. python zip压缩文件下载及解压
  12. OpenCV4学习笔记(59)——高动态范围(HDR)成像
  13. 支持Kubernetes集群运维审计,JumpServer v2.2.0发布丨Release Notes
  14. 计算天数c语言pta,PTA练习7-9 计算天数 (15 分)
  15. 如何培养孩子的记忆力?猿辅导:这个方法家长一定要知道
  16. 视频怎么去水印教程 视频怎么去水印无痕迹
  17. css案例2——黑白滤镜
  18. python 3d绘图模块_Python绘制3D图形
  19. 电路b-3—06刘晏辰
  20. 也谈特征值和特征向量的几何意义

热门文章

  1. BERT代码的解读1---数据处理部分
  2. Eclipse TPTP 分析程序性能
  3. 五位本科生4个月造出芯片毕业!新的后续来了……
  4. 关于Python_fluent
  5. 有水印的图片简直不要太尬!教你去水印,以后精美图片统统拿走!
  6. 微信订阅号申请流程及准备材料
  7. Md5加密算法的原理及应用
  8. oracle批量将id更新为uuid,oracle批量新增更新数据
  9. Scratch五子棋
  10. 少儿编程培训 python