吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6685|回复: 18
收起左侧

[Python 转载] Python3爬虫:基于bs4实现的小说爬虫

[复制链接]
c0ld 发表于 2018-8-12 22:59
BookRobot.py:一款根据小说目录页下载全本小说的爬虫,实现方案较为复杂,使用到了两种不同的爬虫实现方式以及Python中的文件操作函数
实现思路:1.爬行目录页获取每一章节的链接并进行排序保存至缓存文件links.txt文件中
2.读取links.txt文件中的链接并循环链接爬行小说章节内容并保存至Result.txt中,直至将全部内容爬行完毕后保存文件并删除links.txt
[Python] 纯文本查看 复制代码
#Author:c0ld
import os
import re
import urllib.request
from bs4 import BeautifulSoup

#定义核心函数
def getlink(url):
        file = urllib.request.urlopen(url)
        data = str(file.read())
        #构造正则表达式来匹配章节链接
        pat = '<a style="" href="(/book/.*?)"'
        link = re.compile(pat).findall(data)          
        link = list(link)
        #将章节链接由小到大排序,避免出现章节混乱
        link.sort()
        return link
        
def getbook(link):
        #设置代{过}{滤}理信息
        headers = ('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
        opener = urllib.request.build_opener()
        opener.addheaders = [headers]
        urllib.request.install_opener(opener)
        data = urllib.request.urlopen(link).read()
        data = data.decode('utf-8')
        soup = BeautifulSoup(data, 'html.parser')
        title = soup.find('h1')
        value = soup.find('div', id="content")
        #使用list.get_text()函数获取文本
        book = title.get_text()+value.get_text()
        print(title.get_text()+" 下载完成...")
        return book

#从用户处获取基本变量
bookid = input("请输入书籍编号(www.qu.la/book/书籍编号/):")
url = "https://www.qu.la/book/"+bookid
url = str(url)

#生成links.txt
print('================================================')
print('请稍等,正在生成章节链接......')
link = getlink(url)
for linklist in link:
        links = "https://www.qu.la"+linklist[0:]
        filewrite = open('links.txt','a+')
        filewrite.write(links+'\n')
        filewrite.close()
filewrite = open('links.txt','a+')
filewrite.write('end')
filewrite.close()
print('章节链接生成完毕!')

#生成books.txt
print('================================================')
print('请稍等,正在下载小说内容......')
print('等待时间较长,请勿关闭程序或中断网络!')
i = open('links.txt','r')
booklink = i.readlines()
for links in booklink:
        booklinks = links[0:] 
        if booklinks != 'end':
                book = getbook(booklinks)
                filewrite = open('Book.txt','a+')
                filewrite.write(book)
        else:
                filewrite.close()
                os.remove('links.txt')
                print('================================================')
print('小说下载完成!请在本目录查找Book.txt')


如果有任何问题可以在帖子下留言咨询楼主,楼主看到后将一一解答,目前这个版本是单线程版本,运行速度较慢,过段时间完成多线程版本后会开源,感兴趣的同学可以关注一下我

免费评分

参与人数 1吾爱币 +1 收起 理由
demon_lin + 1 我很赞同!但有个建议,需要解决换行问题,这样是一章节一行

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| c0ld 发表于 2018-8-13 14:09
你帅哥 发表于 2018-8-13 00:36
楼主,最近我也在学习python的基础,也准备想学爬虫,但刚接触py,不知道还能往那个方向走,大学快毕业了想 ...

目前Python比较热门的方向就是自动化运维,机器学习,神经网络,人工智能这方面,建议抽空学习一下算法,了解一下这些方面的基础,爬虫可以当作网络编程的练习来编写,比如从正则匹配的爬虫到bs4的爬虫再到多线程爬虫,不断锻炼自己的编程能力和编程思路
demon_lin 发表于 2018-8-13 01:35
本帖最后由 demon_lin 于 2018-8-13 02:28 编辑

楼主,出现关于编码问题
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 20: illegal multibyte sequence
书编号为:3775

解决方式:调用open() 方法时,设置编码  encoding='UTF-8'
TiAmo. 发表于 2018-8-12 23:30
君子不器 发表于 2018-8-12 23:37

需要安装Python3,然后可以在命令行运行该.py文件
你帅哥 发表于 2018-8-13 00:36
楼主,最近我也在学习python的基础,也准备想学爬虫,但刚接触py,不知道还能往那个方向走,大学快毕业了想在py找个吃饭的技术,楼楼能给些建议嘛?
Webrobot 发表于 2018-8-13 00:53
你帅哥 发表于 2018-8-13 00:36
楼主,最近我也在学习python的基础,也准备想学爬虫,但刚接触py,不知道还能往那个方向走,大学快毕业了想 ...

全栈,运维,人工智能,机器学习方向很多的,找个自己感兴趣的领域,这样学习也有动力。
TiAmo. 发表于 2018-8-13 01:13
君子不器 发表于 2018-8-12 23:37
需要安装Python3,然后可以在命令行运行该.py文件

不行啊 找不到book文件
sherlo 发表于 2018-8-13 01:38
TiAmo. 发表于 2018-8-13 01:13
不行啊 找不到book文件

你是cmd没进入到 这个 py文件所在目录运行 ,所以找不到
13570648032 发表于 2018-8-13 08:34
还真像试试!,收了!
速度富贵浮云 发表于 2018-8-13 09:38
又是个很好的学习例子,GET
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 07:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表