爬虫初学(一):爬取笔趣阁小说

不识有话说

作为一个爬虫萌新,第一个小项目当然是爬一爬我们的萌新之友-《新笔趣阁》

虽然没什么难度,

不过还是分享一下自己的代码历程,

希望能给予大家一些思路或帮助,

当然,如果有大佬能够指出错误或可以改进的地方,

那当然更好了,

等你呦~

项目展示

在讲解项目之前,

先给你们展示一下功能,

不然看了半天,

结果不是自己想要的那不是自闭了。0.0

<----------------------------------分割线------------------------------------->

点击打开原图

说实话,感觉我挺憨的才能写出这种代码,谁下载小说不是一整本一整本下,

结果也就我傻大憨的一章一章下,甚至还觉得自己好牛,害

代码思路讲解

项目要用到的模块

import os

from time import sleep

import requests

from lxml import etree

没有的话可以自行安装,虽然大部分小伙伴应该都知道,但还是说一下

pip/pip3 install 想要安装的模块名

模块安装好了接下来讲解代码了

import os

from time import sleep

import requests

from lxml import etree

# 新笔趣阁的全部小说界面链接,所有小说链接都在这里

url = 'http://67bqg.com/index.php?upcache=1

# 请求头

headers = {

    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,

like Gecko) Chrome/73.0.3683.103 Safari/537.36"

}

# 向新笔趣阁发送get请求

all_book_r = requests.get(url, headers=headers)

# 解析返回的HTML页面数据

all_book_html = etree.HTML(all_book_r.content.decode('utf-8'))

首先进入新笔趣阁全部小说页面 >>>点击进入

点击键盘右上方的f12键或者鼠标右键点击检查进入页面调试界面(右边白色部分),

接下来单击调试台左上角的选中按钮,先随便选中一篇小说,

点击后发现左边调试台中的html界面已经跳转到了我们选中的地方,

我们可以发现这是一个ul列表下的一个a标签,并且这个ul列表储存着所有小说的链接,

那这就好办了~

点击打开原图

我们通过Chrome的xpath插件获取到新笔趣阁所有小说的链接

没有的可以自己下载安装一下(强烈推荐,特别好用)

链接: https://pan.baidu.com/s/1_HzBzOp-vaWFkiuE2U9yFQ

提取码: sb7p

xpath使用:这里是一个大佬的博客,不懂的可以看看

点击打开原图

我们将可以正确获取到自己需要信息的代码放入到xpath方法中,

xpath方法会将获取到的HTML页面里自己需要的所有信息放入到一个列表里,

这个列表也就是你设置的变量名

# 储存所有小说链接的列表

all_book_url = all_book_html.xpath('//div[@class="novellist"]/ul/li/a/@href')

# 储存所有小说名的列表

all_book_title = all_book_html.xpath('//div[@class="novellist"]/ul/li/a/text()')

print(all_book_url) # 下图

点击打开原图

设置num值,每循环判断一次num值就+1,直到找到该小说,那么num值将作为上图列表的下标使用,获

取到用户想要下载的小说的链接,进行该小说的数据获取

# 输入你想找的小说名

find_book = input('输入想下载的书名:')

num = 0

# 通过for循环判断是否有用户想找的小说

for book_title in all_book_title:

    # 有则获取该小说你想要的数据

    if find_book == book_title:

        print('找到了,您要的', book_title)

        # 找到该小说的链接

        book_url = all_book_url[num]

        # 向小说页面发送请求

        book_r = requests.get(book_url, headers=headers)

        # 解析

        book_html = etree.HTML(book_r.content.decode('utf-8'))

        # 该小说的章节链接列表

        book_url = book_html.xpath('//div[@id="list"]/dl/dd/a/@href')

        # 该小说的章节名列表

        chapter_title = book_html.xpath('//div[@id="list"]/dl/dd/a/text()')

    # 循环一次下标加一

    num += 1

为了防止下载的小说都装在一个文件夹里,

不仅混乱而且很难找到自己想看的小说章节(其实只要小说内容装在一起就不用这么麻烦,但是当时

我妹想到)

# 判断该路径是否存在,存在则返回true,不存在则返回flase

judge = os.path.exists('../小说/%s' % str(book_title))

# 判断judge是否为true,如果不是则创建该路径

if not judge:   

    os.makedirs('../小说/%s' % str(book_title))

通过用户输入的值,将需要的章节链接循环取出,然后通过xpath获取小说文本内容

# 告诉用户小说有多少章节

print('<------请输入数字(该小说共有%s章)------>' % len(chapter_title))

        # 获取用户需要下载的章节

        download_book_start = int(input('输入从第几章开始下载:'))

        download_book_end = int(input('输入到第几章结束:'))

        chapter_num = 0

        # download_book_start - 1是因为列表下标是从0开始的

        for book_content_url in book_url[download_book_start - 1:download_book_end]:

            # 防止获取太快get不到数据

            sleep(2)

            new_book_content_url = 'http://www.xbiquge.la' + book_content_url

            book_content_r = requests.get(new_book_content_url, headers=headers)

            book_content_html = etree.HTML(book_content_r.content.decode('utf-8'))

            # 该章节小说内容列表

            book_content = book_content_html.xpath('//div[@class="box_con"]/div

[@id="content"]/text()')

将内容列表里的数据一个个循环出来存到all_content字符串中,

然后通过with open方法,写入到text文件里

            with open('../小说/%s/%s.text' % (str(book_title), chapter_title

[download_book_start + chapter_num -1]), 'w', encoding='utf-8') as write_content:

                # 用来储存小说内容的字符串

                all_content = ''

                for content in book_content:

                    all_content += content

                write_content.write(all_content)

                print(chapter_title[download_book_start + chapter_num -1], '--下载成功')

                # 用来获取小说章节名

                chapter_num += 1

        print('全部下载完成')

emmm,大概可能也许讲完了,应该讲的挺详细的,

萌新第一次写,如果有什么不足,可以提出来(勿喷),会慢慢改进的

完整代码

import os

from time import sleep

import requests

from lxml import etree

url = 'http://67bqg.com/index.php?upcache=1'

headers = {

    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,

like Gecko) Chrome/73.0.3683.103 Safari/537.36"

}

all_book_r = requests.get(url, headers=headers)

all_book_html = etree.HTML(all_book_r.content.decode('utf-8'))

all_book_url = all_book_html.xpath('//div[@class="novellist"]/ul/li/a/@href')

all_book_title = all_book_html.xpath('//div[@class="novellist"]/ul/li/a/text()')

print(all_book_url)

find_book = input('输入想下载的书名:')

num = 0

for book_title in all_book_title:

    if find_book == book_title:

        print('找到了,您要的', book_title)

        book_url = all_book_url[num]

        book_r = requests.get(book_url, headers=headers)

        book_html = etree.HTML(book_r.content.decode('utf-8'))

        book_url = book_html.xpath('//div[@id="list"]/dl/dd/a/@href')

        chapter_title = book_html.xpath('//div[@id="list"]/dl/dd/a/text()')

        judge = os.path.exists('../小说/%s' % str(book_title))

        if not judge:   

          os.makedirs('../小说/%s' % str(book_title))

        print('<------请输入数字(该小说共有%s章)------>' % len(chapter_title))

        download_book_start = int(input('输入从第几章开始下载:'))

        download_book_end = int(input('输入到第几章结束:'))

        chapter_num = 0

        for book_content_url in book_url[download_book_start - 1:download_book_end]:

            sleep(2)

            new_book_content_url = 'http://www.67bqg.com' + book_content_url

            book_content_r = requests.get(new_book_content_url, headers=headers)

            book_content_html = etree.HTML(book_content_r.content.decode('utf-8'))

            book_content = book_content_html.xpath('//div[@class="box_con"]/div

[@id="content"]/text()')

            with open('../小说/%s/%s.text' % (str(book_title), chapter_title

[download_book_start + chapter_num -1]), 'w', encoding='utf-8') as write_content:

                all_content = ''

                for content in book_content:

                    all_content += content

                write_content.write(all_content)

                print(chapter_title[download_book_start + chapter_num -1], '--下载成功')

                chapter_num += 1

        print('全部下载完成')

        break

    elif num + 1 == len(all_book_title):

        print('查无此书')

    num += 1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容