python爬虫——从此不用再愁找不到小说txt文件

最近在学习python,学了个大概就开始写爬虫了,之前做了个糗百的简单爬虫,然后底下还做了一些学校教务系统的爬虫,爬取了自己的成绩,看着挂科的大英,心中一万头草泥马走过,说下今天的正题

昨天才感觉自己的爬虫基础还不是很好,就准备做几个小程序练手,就想到了从小就看的电子小说,当时可以是千辛万苦才从网站找到的TXT文件,传到我的MP5上半夜偷偷看,现在想起来还是美滋滋,又跑偏了
于是乎,我准备做一个可以自动爬取一部电子小说TXT文件的程序

接下来就是百度“免费小说网”,然后选取了笔趣阁,进行了爬取,在这里感谢笔趣阁


我们要做的步骤
1. 输入你要寻找的小说全名并将其数据化传入请求访问的全书网搜索界面 ->
2. 找到搜索界面第一个小说的名字与你寻找的小说名字匹配,如果匹配失败则提示并退出,成功则提取第一个小说的网址进行访问 ->
3. 访问小说文章页面,并且提取所有章节的链接进行后续访问 ->
4. 最后进每一章内容的抓取,保存到本地txt文件中 ->Over


One

首先要会使用浏览器的F12功能

红线画出来的区域其实就是在搜索URL“http://so.ybdu.com/cse/search?”后面加的后缀(我对网页方面只是简单了解,所以用通俗的语言说),其中s和entry都是固定的,q后面则是我输入的“盘龙”的URL编码,以下是核心代码

    base_url = 'http://so.ybdu.com/cse/search?'name = raw_input('请输入你要寻找的电子书完整名称:')headers = {'User-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0'}data = urllib.urlencode({'q':name,'s':'14402670595036768243','entry':'1'})real_url = base_url + datareq = urllib2.Request(real_url,headers=headers)time.sleep(1)#单次连接会出现错误,错误后休息1s后继续尝试连接while True:try:rep = urllib2.urlopen(req)breakexcept BaseException:time.sleep(1)html = rep.read()

使用到了urllib.urlencode、urllib2.Requesut和urllib2.urlopen函数,函数的具体功能如果不清楚可以自行百度
最后得到了搜索后界面的html代码

这里有个while True:… 这里是什么意思呢?
主要是如果只是单次打开的话,会出现Error 10054,百度了一番之后好像是超市问题,但是并没有找到合适的解决方法,就是用这种强制打开的方式,如果打开出错,就暂停1s之后继续打开,解决错误

Two

获取到搜索结束界面的HTML代码之后,需要将第一个搜索结果与输入的小说名字进行对比,如果成功则获取该小说的章节界面的URL进行下一步的访问,失败则提示返回。

下面是搜索网页的源代码

可以看到每一个搜索结果的名字在<a cpos="title"... ></a>里面,所以直接提取出来做对比就OK
代码中使用的是bs4库中的Beautifulsoup函数

    soup = BeautifulSoup(html,'html.parser')sousuoname = soup.find(class_="result-game-item-title-link").get_text()if cmp(str(sousuoname),name):name = name+'.txt'name = name.decode('utf-8')filename = open(name,'a')search_data(soup,filename)filename.close()else:print '搜索失败'

Three

上一步获取了小说章节的URL,并且将URL和已经打开的文件传入search_data()函数,进一步抓取信息

分析网页源码可以知道每一章节其实在一个li中,而章节的网址就是<a href="140210.html">...</a>href中再加上基础网址,就是你传入函数的URL

    wenzhang_base_url = soup.find(class_="result-game-item-title-link")href = re.compile(r'href="(.+?)"')#找到小说章数页面   base urlwenzhang_base_url = re.findall(href,str(wenzhang_base_url))[0]#访问小说页面  获取htmlreq = urllib2.Request(wenzhang_base_url,headers=headers)html = urllib2.urlopen(req).read().decode('gbk').encode('utf-8')#使用Beautifulsoup寻找每一章soup1 = BeautifulSoup(html,'html.parser')little_list = soup1.find('ul',class_='mulu_list')little_list = re.findall(re.compile(r'<li>(.+?)</li>'),str(little_list))for i in little_list:href = re.compile(r'href="(.+?)"')href = re.findall(href,i)wenzhang_url = wenzhang_base_url + href[0]#print wenzhang_urlfun(wenzhang_url,filename)

代码中的注释已经很清楚了,可能我写的有一部分可以用更简单的方法,大家自行摸索

Four

上一步找到了具体的每一章节,进行一个for循环,将每个章节的URL和文件传入fun()函数,就是进行具体的文章爬取

分析源码,可以看到每一章节的标题在<div class="hititle"><h1>中,而文章则在<div id="htmlContent"....>中,所以使用Beautifulsoup函数进行提取

headers = {'User-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0'}req = urllib2.Request(url,headers=headers)# 单次连接会出现错误,错误后休息1s后继续尝试连接while True:try:rep = urllib2.urlopen(req)breakexcept BaseException:time.sleep(1)html = rep.read()soup = BeautifulSoup(html,'html.parser')name = soup.find(class_="h1title").h1.get_text()text = soup.find(class_="contentbox").get_text()text = text.strip().split('\n')[0].split()

这一部分最后两行可能不是一眼就能看明白的,所以大家尝试的时候可以进行分布来测试,可以方便理解

爬取到内容就是最后一步,将内容写入文件中

    filename.write('************'+name.encode('gbk','ignore')+'**************'+'\n')for i in text:filename.write('  '+ i.encode('gbk','ignore') +'\n')print '%s is ok' % nametime.sleep(0.25)

这里有使用encode函数的’ignore’参数,具体作用可以自行百度,如果不加的话,会出现Bug,我一开始也是不清楚这个参数,然后就懵逼了很久,网页的编码明明是’gbk’,为啥就会出现无法编译的错误,大家自己做的时候可以试一试,找找其中的感觉233333

好了,这就是我做的一个小说txt文件自动下载程序,只要你搜索的小说在这个网站中能搜到,就可以使用,如果有什么问题可以在评论里留言,我会尽力解答,我是个小菜鸡,希望可以交到互相学习的朋友,一起努力

由于爬取速度太慢,我有考虑到Requests库,于是又用requests爬一下,与之前做了下对比,分享给大家

最后两个版本的完整的代码在我的Github上面,urllib or urllib2 or requests

对scrapy爬虫框架有兴趣的小伙伴,可以了解下我的这篇博客,同样是实战篇。

转载于:https://www.cnblogs.com/GF66/p/9785459.html

python爬虫——从此不用再愁找不到小说txt文件相关推荐

  1. python爬虫工程师工资-通过自学找一份Python爬虫工程师的工作

    最近忙于准备婚礼,博客没能稳定更新.之前为了找工作,写了很多爬虫实战的文章.现在工作找到了,我想对这段时间的经历做一个总结,打算用三篇文章完成这个事情: 本文.交代一下我的背景.自学了点什么(看了什么 ...

  2. python爬虫工程师-记录一下自己找“python爬虫工程师实习生”岗位的经历

    今天是2018年9月11号,是我实习的第二天,记录一下找工作的历程,本来准备昨晚写的,但是第一天来实习,有点累了,就早点睡了,早上醒了,洗漱一下就来写这篇文章了. 鄙人的水平很低,而且还是一名大四的学 ...

  3. 使用 requests+lxml 库的 Python 爬虫实例(以爬取网页连载小说《撒野》为例)

    需求目标 介绍使用 requests 库与 lxml 库进行简单的网页数据爬取普通框架与爬虫实例,本文以爬取网页连载小说<撒野>为例~ 当然有很多小说基本都能找到现成的 .txt 或者 . ...

  4. 简明python教程txt-Python新手的数据批量处理教程(TXT文件)

    最近想用python批量处理数据,把自己网上找答案的过程整理了一下,希望对大家有用. 问题: 一个文件夹中有38个txt文件,这38个txt的命名各不相同,要把这38个txt文件中的数据整合到一个tx ...

  5. python输出print到txt-pycharm实现print输出保存到txt文件

    程序比较大,运行时间又长的时候,不想等着结果,只要先确保程序功能正确无误,可以把需要的结果print然后保存到TXT文件中,超级方便 # 创建一个txt文件,文件名为mytxtfile def tex ...

  6. python如何输入多行数据合并_python 实现将txt文件多行合并为一行并将中间的空格去掉方法...

    有一个txt文本如下: 151 151 1234561 156421 214156 1523132 031320 现希望将两行合并为一行,并将中间所有的空格都去掉: (python编程第十章) 代码如 ...

  7. python找到一行单词中最长的_python - 查找.txt文件中最长的单词,不带标点符号 - SO中文参考 - www.soinside.com...

    我正在做Python文件I / O练习,尽管在尝试查找.txt文件每一行中最长的单词的练习上取得了巨大进步,但我无法摆脱标点符号.] > 这是我的代码:with open("origi ...

  8. 如何入门Python爬虫,你不妨先找个项目做一做

    "入门"是良好的动机,但是可能作用缓慢.如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习. 另外如果说知识体系里的每一个知识点是图里的点,依 ...

  9. 个人永久性免费-Excel催化剂功能第35波-Excel版最全单位换算,从此不用到处百度找答案...

    全球化的今天,相信我们经常可以有机会接触到外国的产品,同时我们也有许多产品出口到外国,国与国之间的度量单位不一,经常需要做一些转换运算,一般网页提供这样的转换,但没有什么比在Excel上计算来得更为方 ...

最新文章

  1. bicg matlab,除了bicg之外,还可以使用哪些迭代子解算器来解决MATLAB中的牛顿方程?...
  2. 外行看Flash的存储原理
  3. 周博磊自述5年研究经历:一个神经元的价值和一个神经病的坚持
  4. Hive参数性能调优
  5. linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决
  6. Java 1.1.6 码点与码点单元(回)
  7. JavaScript声明变量详解
  8. thinkphp商城
  9. 微信小程序UI设计(二)之view组件
  10. 提取酷我音乐MP3外链地址 可放到QQ空间做背景音乐
  11. OpenWRT设置ADGuardHome+小喵咪
  12. Magento后台添加商品(Simple Product和Configurable Product)
  13. CRC32 Hash PK Murmur Hash
  14. 软交换总结之二-七号信令
  15. python实验总结与分析_Python实验报告七
  16. 日出日落时间和年均光照时长计算 java
  17. 小程序正则验证 身份证号、统一社会信用代码
  18. 迷你图书管理器1.2 - 面向对象+集合
  19. MQTT Mosquitto安装和使用
  20. (UE4 4.27)自定义PrimitiveComponent

热门文章

  1. Uva 10305 给任务排序
  2. MySQL优化经验-值得细细品读
  3. tomcat 5.5 jdbc myeclipse8.0
  4. 怎样测试运算放大器的输入失调电压?
  5. 关闭计算机后自动开机的解决方法
  6. 扫描到U盘但找不到文件
  7. 为什么傅里叶变换可以代替自注意力机制
  8. 人工智能之自然语言的从新思考
  9. Lua基本语法-lua与C#的交互(相当简单详细的例子)
  10. 12C -- DDL日志