代码先锋网 代码片段及技术文章聚合

记第一个python爬虫项目:笔趣阁小说爬取

技术标签: python

最近考完试了,开始学习python爬虫,由于一些盗版小说网站几乎没有反爬机制,且网页结构简单,所以选择了小说网站笔趣阁来进行python爬虫的学习。

0X00、准备工作

安装标准库lxml、requests、re和requests.exceptions


0X01、页面分析

我们以小说《九星霸体诀》为例,首先查看页面源码,整个页面只有一个<h1>标签,包裹了本章小说的标题,而正文内容全部在一个<div>标签中,每段的间隔则是一个<br>标签,简单的页面结构使得我们的爬取工作简单了很多。
在这里插入图片描述
在这里插入图片描述然后观察每章小说的URL,第一章URL为:https://www.biquge.tw/47_47879/3155529.html,之后每章在之后的数字递增。
不过要注意,之后有的数字被跳过了,在爬取的时候要对其内容进行判断得知是否为有效URL。


0X02、代码实现

首先第一个爬取单个页面的函数get_one_page,传入参数url,请求该页面,如果返回状态码200,证明请求成功,然后由于前面提到的无效的url也会返回200,所以进行了简单的判断,返回内容是否含有“章”字,如果有则函数返回响应内容,无则返回None。

def get_one_page(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            if '章' in response.text:
                return response.text
        else:
            return None
    except RequestException:
        return None

之后是第二个函数parse_page,对得到的响应的内容进行解析,并将其存入文档中,注意这里的html.replace(u’\xa0’, u’ '),如果不进行替换,则会出现报错:UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position 0。然后将每个<br/>标签替换为换行符。
之后由于标题在仅有的<h1>标签中,所以我们就选择了使用正则表达式来进行标题的提取。
然后正文内容的话,我们选择使用xpath来进行提取。之后还要对内容进行一些处理,将前后的空白内容全部删掉,将每段前面的空格替换为水平制表符\t。
这一步开始我写的是text = re.sub(' *', '\t', text),但是不知道为什么没有成功替换,于是我直接放入了段首的八个空格。

def parse_page(html):
    html.replace(u'\xa0', u' ')
    html = re.sub('<br/>', '\n', html)
    # 正则表达式匹配获取标题
    title = re.search('<h1>(.*)</h1>', html, flags=0)
    print(title.group(1) + ' 开始爬取')
    html = etree.HTML(html)
    # xpath获取正文内容
    context = html.xpath('//*[@id="content"]')
    for i in context:
        with open('context.txt', 'a+', encoding='utf-8') as file_data:
            file_data.write(title.group(1) + '\n\n')
            text = i.text.strip()
            text = re.sub('      ', '\t', text)
            file_data.write('\t' + text + '\n')
            print('爬取成功')

之后就是代码的主体部分,for循环得到每一个url,然后对其进行请求,如果返回不为None,则进行相应内容的解析,最终代码完成。

if __name__ == '__main__':
    for i in range(3155529, 3239451):
        url = 'https://www.biquge.tw/47_47879/' + str(i) + '.html'
        html_data = get_one_page(url)
        if html_data is not None:
            parse_page(html_data)

0X03:完整代码

import requests
from requests.exceptions import RequestException
from lxml import etree
import re


def get_one_page(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            if '章' in response.text:
                return response.text
        else:
            return None
    except RequestException:
        return None


def parse_page(html):
    html.replace(u'\xa0', u' ')
    html = re.sub('<br/>', '\n', html)
    # 正则表达式匹配获取标题
    title = re.search('<h1>(.*)</h1>', html, flags=0)
    print(title.group(1) + ' 开始爬取')
    html = etree.HTML(html)
    # xpath获取正文内容
    context = html.xpath('//*[@id="content"]')
    for i in context:
        with open('context.txt', 'a+', encoding='utf-8') as file_data:
            file_data.write(title.group(1) + '\n\n')
            text = i.text.strip()
            text = re.sub('      ', '\t', text)
            file_data.write('\t' + text + '\n')
            print('爬取成功')


if __name__ == '__main__':
    for i in range(3155529, 3239451):
        url = 'https://www.biquge.tw/47_47879/' + str(i) + '.html'
        html_data = get_one_page(url)
        if html_data is not None:
            parse_page(html_data)

0X04:反思

这是我写的第一个python爬虫项目,很简陋,而且运行效率很低,不知道是我的电脑有问题还是怎么回事,每次都是爬了几十章甚至十几章后就会卡顿半天甚至卡顿好几分钟(害)。
接下来去学习多线程,让代码可以变得高效一些,加油!

版权声明:本文为qq_45653588原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45653588/article/details/107105090

智能推荐

爬虫案例:爬取笔趣阁小说

捣鼓了两天啊,,,,各种问题我要吐了,,,,,,果然我太菜了(哭) 然后我发现了一个真理,,,,如果你感觉写的代码没问题,,一定时你请求头复制的不够多,,,,,(显得我好垃圾) 反正不知道服务器检测那个,多复制一点肯定没问题啦,,hhhhh...

Python实例(爬虫第一期)Python3.7 多线程爬取笔趣阁(buquge.tv)完本小说(原创)

原创,未经授权请勿转载! 开发基于python3.7(非Python2); IDE是pycharm2019社区版(足够用了); 重点告诫!本文章仅供Python交流学习! 严重警告!请勿用于非法用途! 友情提醒!爬虫爬得好,牢饭吃得早! 侵删!侵删!侵删!重要的事情要说三遍。 产品需求: 1、 代码可以将笔趣阁完本小说分栏(共800多部)每本小说的简介和章节链接爬取下来,存入本地的csv文件或者m...

Python爬取笔趣阁小说2.0版

之前的爬虫文章中,我们只可以爬取某本特定的小说,小波大叔一般喜欢看玄幻和修真类的,那么想把这一类小说全部爬下来该怎么操作呢,2.0版本来了,依然还是笔趣阁网站,初学者而言,这个没有反扒机制,比较方便。   第一步仍然是选取我们需要的解析库和正则库。 之后的发起请求和之前一样,要注意一点的是,本次爬取中,我们需要两次调用此函数,原因后边讲。 要想获取一类小说的所有url,就需要先得到每本小说的地址信...

python+selenium爬取笔趣阁小说

代码如下: 需要安装的依赖 chromedriver问题 到以下地址下载电脑上安装的chrome版本对应的driver http://chromedriver.storage.googleapis.com/index.html 然后放到 1、\Google\Chrome\Application; 2、\Python36\Scripts这两个目录下, 再把1的路径添加到环境变量path里,接着测试一...

猜你喜欢

python学习实践--爬取笔趣阁小说

仔细想想自己以前也是个爱看小说的人,虽说浪费时间,但感觉还是对语文和语言表达啥的有点帮助的,所以利用自己所学干点喜欢的事也是相当不错的。 这里以笔趣阁的一本叫做《全球高武》小说为例,主要是目的是把自己最近学的东西实践一下。 爬取目标网址:http://www.biqu6.com/23_23465/ 分析工作 小说这东西无疑是一章一章的,所以先打开第一章,发现url是http://www.biqu6...

python + selenium 爬取笔趣阁小说

加粗样式 import os from selenium import webdriver from time import sleep def xiaoshuo_url(url): driver=webdriver.Chrome() driver.implicitly_wait(10) driver.get(url) page=1 while page <= 1160: print(&ld...

1.python爬取笔趣阁小说

前一阵无聊想学习python,就有了以下代码,选取了笔趣阁这个大众化的网站,百度发现以笔趣阁为名的小说网站很多,本段代码只在百度结果里选取前五条,并选取了三个叫笔趣阁的网站,前五条里包含笔趣阁的任意一个网址就开始爬取。...