python 实现爬取指定小说(两种实现方案 .附源码)

python 实现爬取指定小说实时下载(附源码)

import requests
import re
import time
import random


def download(book_name):
    # 下载小说
    search_real_url = 'https://www.biquge5200.cc/modules/article/search.php?searchkey=' + book_name
    try:
        novel_source = requests.get(search_real_url).text
        reg1 = r'<td class="odd"><a href="(.*?)">(.*?)</a></td>.*?<td class="odd">(.*?)</td>'
        # 所有搜索到的结果(包括小说网址、名称、作者姓名)
        novel_list = re.findall(reg1, novel_source, re.S)
        # 判断是否有结果返回
        if len(novel_list) == 0:
            print('你要找的小说不存在,请检查后重新输入')
    except Exception as e:
        print(e)
    for novel_url, novel_name, novel_author in novel_list:
        if novel_name == book_name:
            print('你即将下载的小说:%s 作者:%s' % (novel_name, novel_author))
            return novel_url, novel_name


def get_chapter(url):
    # 获取章节页面
    try:
        # 章节页面源代码
        chapter_page_source = requests.get(url).text
        reg2 = r'<dd><a href="(.*?)">(.*?)</a></dd>'
        chapter_list = re.findall(reg2, chapter_page_source)
        # print(chapter_list)
    except Exception as e:
        print(e)
    return chapter_list


def get_content(chapter_list, novel_name):
    """

    :param chapter_list:
    :param novel_name:
    """
    count = 0
    length = len(chapter_list)
    for chapter_url, chapter_name in chapter_list:
        try:
            time.sleep(1 + random.random())
            content_source = requests.get(chapter_url).text

            # print(content_source)
            reg = r'<div id="content">(.*?)</div>'
            content = re.findall(reg, content_source, re.S)[0]
            stsdw = re.sub('<p>(.*?)\(《》\)</p>', ' ', str(content))
            print(stsdw)
            contents = stsdw.replace('</p><p class="">', '\n').replace('  ', '\n\t\t').replace('<p>', '').replace('</p>', '')
            print('contents:')
            print(contents)
            count += 1
            with open(novel_name + '.txt', 'a', encoding='utf-8') as f:
                f.write(chapter_name + '\n' + contents + '\n' * 2)
                print('正在写入: ' + chapter_name)
                print('进度:%0.2f' % (count / length) + '%')
        except Exception as e:
            print(e)


if __name__ == '__main__':
    book_name = input('请输入小说名:')#'圣墟' 凡人修仙传
    novel_url, novel_name = download(book_name)
    chapter_list = get_chapter(novel_url)
    get_content(chapter_list, novel_name)

##以上内容仅供学习使用

实现效果图
爬取 笔趣阁 的《凡人修仙传》,请勿过度爬取他人网站,后果自负。

这也没啥,村里的其他孩子也是“狗娃”“二蛋”之类的被人一直称呼着,这些名字也不见得比“二愣子”好听了哪里去。

实现效果二:
利用爬虫xpath 进行爬取笔趣阁 的《凡人修仙传仙界篇》,该代码更容易理解:
说明:该网站搜索功能崩溃,无法使用 输入搜索功能
可自行打开网站进行,选取后修改类中URL
如下:
  		self.server = 'http://www.biquge.info/书号id/'
        self.target = 'http://www.biquge.info/书号id/'
当然你不想爬取这个网站也行,可执行修改爬取网站,xpath 的总体实现思路以提供
当然绝大部分网站是有反爬策略的,注意合理配置,访问即可
import requests, sys
from lxml import etree
import io
import re

"""
类说明:下载《笔趣阁》网小说《凡人修仙传仙界篇》
Parameters:
    无
Returns:
    无
Modify:
    2019-12-24
"""


class downloader(object):

    def __init__(self):
        self.server = 'http://www.biquge.info/22_22533/'
        self.target = 'http://www.biquge.info/22_22533/'
        self.names = []  # 存放章节名
        self.urls = []  # 存放章节链接
        self.nums = 0  # 章节数
        self.books = 0  #书名


    """
    函数说明:获取下载链接  
    Parameters:
        无
    Returns:
        无
    Modify:
        2019-12-24
    """

    def get_download_url(self):
        req = requests.get(url=self.target)
        # print(req.status_code)
        html = req.content.decode()
        element = etree.HTML(html)
        trs = element.xpath('//*[@id="list"]/dl/dd/a/@href')
        trns = element.xpath('//*[@id="list"]/dl/dd/a/text()')
        name = element.xpath('//*[@id="info"]/h1')[0]
        self.books = name
        # self.author = name
        for tr in trs:
            self.urls.append(self.server + tr)
        for tr in trns:
            self.names.append(tr)
        self.nums = self.urls.__len__()

    """
    函数说明:获取章节内容
    Parameters:
        target - 下载连接(string)
    Returns:
        texts - 章节内容(string)
    Modify:
        2019-12-24
    """

    def get_contents(self, target):
        req = requests.get(url=target)
        contens = req.content.decode('utf-8')#设置编码格式
        trs = etree.HTML(contens)
        text = trs.xpath('//*[@id="content"]/text()')
        stale = io.StringIO()
        for tr in text:
            stale.write('\n\t' + tr)#添加个格式,让文本更合理展示
		re.time(1)#休眠1秒后执行
        return stale.getvalue()

    """
    函数说明:将爬取的文章内容写入文件
    Parameters:
        name - 章节名称(string)
        path - 当前路径下,小说保存名称(string)
        text - 章节内容(string)
    Returns:
        无
    Modify:
        2017-09-13
    """

    def writer(self, name, path, text):
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')


if __name__ == "__main__":
    dl = downloader()
    dl.get_download_url()
    print('《'+dl.books.text+'》开始下载:')
    for i in range(dl.nums):
        dl.writer(dl.names[i], dl.books.text+'.txt', dl.get_contents(dl.urls[i]))
        sys.stdout.write("  已下载:%.3f%%" % float(i / dl.nums) + '\r')
        sys.stdout.flush()
    print(dl.books.text+'下载完成')

在这里插入图片描述
最后:本人实现了许多代理池的免费 ip 爬取 网站尽20余个,需要xpth 实现脚本的@该账号

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python爬虫是一种通过编写程序来获取互联网上的数据的技术。对于爬取招聘网站数据,可以使用Python中的一些第三方库如Scrapy或BeautifulSoup来实现。 首先,我们需要分析招聘网站的HTML结构,找到我们需要爬取的数据所在的元素位置。然后,编写Python代码,使用相应的库来提取所需的数据。这些数据可以包括职位名称、公司名称、薪资水平等。 接下来,我们可以使用Tableau来进行数据可视化和交互。Tableau是一款功能强大的商业智能工具,可以帮助我们将数据变成易于理解和分析的可视化图表。可以通过将爬取到的数据导入Tableau,然后使用Tableau的图表、地图、仪表盘等功能来展示数据。 通过Tableau的交互大屏功能,我们可以实现对数据的实时展示和交互。例如,我们可以设置数据刷新时间,使得大屏能够显示最新的招聘信息。我们还可以添加筛选器和参数控制,使用户能够自由地根据需求进行数据过滤和分析。 最后,将Python爬取数据和Tableau可视化交互大屏的源码整合起来,就可以实现将招聘网站数据爬取并用Tableau进行可视化展示的功能。这个源码可以分为两部分,一部分是爬虫代码,负责数据的爬取和处理;另一部分是Tableau代码,负责将数据导入Tableau并进行可视化展示。 综上所述,通过Python爬虫获取招聘网站数据,并使用Tableau进行可视化交互大屏展示,是一种非常有效的数据分析方法。这样可以将庞大的数据转化为直观、易懂的图表,方便用户进行数据的理解和决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值