c0ld 发表于 2018-8-12 22:59

Python3爬虫:基于bs4实现的小说爬虫

BookRobot.py:一款根据小说目录页下载全本小说的爬虫,实现方案较为复杂,使用到了两种不同的爬虫实现方式以及Python中的文件操作函数
实现思路:1.爬行目录页获取每一章节的链接并进行排序保存至缓存文件links.txt文件中
2.读取links.txt文件中的链接并循环链接爬行小说章节内容并保存至Result.txt中,直至将全部内容爬行完毕后保存文件并删除links.txt
#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 =
      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
      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
      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')

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

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

TiAmo. 发表于 2018-8-12 23:30
怎么运行?

需要安装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

还真像试试!{:1_918:},收了!

速度富贵浮云 发表于 2018-8-13 09:38

又是个很好的学习例子,GET
页: [1] 2
查看完整版本: Python3爬虫:基于bs4实现的小说爬虫