热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python简单爬虫第六蛋!(完结撒花)

第六讲:今天我们来实战一个项目,我本人比较喜欢看小说,有一部小时叫《圣墟》不知道大家有没有听说过,个人觉得还是不错的,现在联网的时候,都可以随时随地用手机打开浏览器搜索查看,但是有时候也会遇到

第六讲:

  今天我们来实战一个项目,我本人比较喜欢看小说,有一部小时叫《圣墟》不知道大家有没有听说过,个人觉得还是不错的,现在联网的时候,都可以随时随地用手机打开浏览器搜索查看,但是有时候也会遇到没有网络的情况,这个就很扎心了,有什么办法呢?所以这个项目基于这么一个现实背景来分析实现一下,把我们前几次讲到一些技术方法都运用一遍。

  (有人可能会说直接下载一个txt格式的小说文本文件不就好了,虽然是挺方便的,但是懒惰是不好的习惯,而且也没有运用到所学的知识,那么我们何必要学习呢?为什么要学,看完实例就知道了!)

  现在开始我们的实战项目,首先我们想到我们的爬虫可以访问到一个网站,能把网站的HTML文本内容中有用的信息提取处理,如果我们需要的小说的内容都在这个文本里面就好了,那么我们实现起来就比较容易,毕竟我们之前都学过怎么爬取,假如我们爬取到了内容,这些内容又应该怎么保存起来呢,这里就想到了文件处理,把小说内容都转储到一个txt文件里面。

  首先有了这么一个大概思路:

  ①   爬取小说网页的内容

  ②   转储到一个txt文件里面

 

  我们来详细分析第一个步骤,既然是要爬取小说的网页,那么我们就要选择一个比较容易爬取的网站,这里我们经过多次审查,最终确定了一个网   站:http://www.biqiuge.com/book/4772/

  名字叫笔趣阁,这个网页有所有章节的网站,那么我们就可以根据每个章节对应的一个网页进行内容爬取,简单来说就是第一大步骤里面又分为两个小步骤,首先是爬取所有章节的url链接,然后根据每个url链接再爬取相应章节的内容。

  下面对网页html进行详细分析,

  由图可以看出在

标签里面包含了所有我们要提取章节url链接的信息,但是有点小麻烦就是有一个最新章节的列表和正文列表是同一个等级排列,如果我们直接用BeautifulSoup中的find_all()方法的话,会把最新章节列表的内容也包含进来,这里就需要我们能把最新章节列表和正文列表的url进行分离了。

 

  通过前五章的url链接我们可以清楚看到,每个章节不同的只是4472/后面的数字,那么我们是不是可以用re模块创建一个正则表达式对象来提取呢?

  好的,带着想法我们进入IDE环境,进行我们的编码:

  首先搭建好我们的代码框架

 1 import requests
 2 
 3  
 4 
 5 from bs4 import BeautifulSoup
 6 
 7 import bs4
 8 
 9 import re
10 
11  
12 
13 def getHTML_Text(url):
14 
15         return ''
16 
17  
18 
19 def Get_Catalog(ulist,url):
20 
21     return ''
22 
23    
24 
25 def Get_Content(ulist,url):
26 
27     return ''
28 
29  
30 
31 def Save_file(ulist):
32 
33     return ''
34 
35    
36 
37 def main():
38 
39     url = 'http://www.biqiuge.com/book/'
40 
41     catalog_url = []
42 
43     Get_Catalog(catalog_url,url+'4772/')
44 
45     for i in catalog_url:
46 
47         str_temp = ''
48 
49         Get_Content(str_temp,url+i)
50 
51         Save_file(str_temp)
52 
53  
54 
55 if __name__ == '__main__':
56 
57     main()

 

  在main()函数中,首先是获取所有的url链接到我们的catalog_url列表中,然后用一个for循环迭代每一个url链接,然后对其爬取章节的内容,爬取完之后保存到txt文件中。

  其中getHTML_Text()已经用了很多遍了,直接套用前几期讲到的通用代码框架就好了,接下来我们看Get_Catalog()函数:

 1 def Get_Catalog(ulist,url):
 2 
 3     html = getHTML_Text(url)
 4 
 5     for i in re.findall(r'4772/\d+.html',html):
 6 
 7         ulist.append(i)
 8 
 9     for j in range(9):
10 
11         del ulist[0]

 

  爬取到每个章节的专属url链接的部分之后,我们发现其实有多余重复的部分,就用del把前面8个url链接删除掉。

 

  我们一共获取了1049个url链接,我们来核对一下数量到底对不对,

 

  由82开始到1130结束,1130-82+1=1049,刚刚好获取到了每个章节特有的url链接,后面使用的时候只需要用字符串+就构造好我们需要的各个章节的url链接了。

  然而事情并不是想象中那么顺利。。。

  这个网站的服务器居然能识别出我这只小小爬虫了,我#!¥!%

 

 

  即使不是产生异常,那也只有小说里面的一句话作为返回,真的是气死老夫了!

  这时候要转移目标了,虽然很心痛,但是前面积累了经验,到后面就可以很快就用得上了,问题不大。(默默流泪,技术还是不过关,菜鸟一枚)不断失败,不断尝试,不断进步!

  我们重新搭建框架:

 1 import requests
 2 
 3 import re
 4 
 5  
 6 
 7 def getHTML_Text(url):
 8 
 9     return ‘’
10 
11 def Get_Catalog(ulist,url):
12 
13 return ‘’
14 
15 def Get_Content(str_temp,url):
16 
17 return ‘’
18 
19 def Save_file(f,str_temp):
20 
21     return ‘’
22 
23 def main():
24 
25     url = 'http://www.liushuba.com/files/article/html/60/60255/'
26 
27     catalog_url = []
28 
29     Get_Catalog(catalog_url,url)
30 
31    
32 
33     for i in catalog_url:
34 
35             str_temp = ''
36 
37             Get_Content(str_temp,url+i)
38 
39  
40 
41 if __name__ == '__main__':
42 
43     main()
44 
45  

 

  这里我们用的是新网站,也就是上面代码的url链接,分析过程与笔趣阁网站的分析一样,这里就跳过了。

  getHTML_Text()函数仍然是通用的代码框架,而我们的Get_Catalog()函数就发生了改变,因为我们新找到的网站结构更简单了!

  看函数:

1 def Get_Catalog(ulist,url):
2 
3     html = getHTML_Text(url)
4 
5     for i in re.findall(r'\d+.html',html):
6 
7         ulist.append(i)

 

用正则表达式\d+.html 就能直接找到所有的各个章节的url链接了!

 

接着就是获取每个章节的内容和保存本章节内容的函数了:

 1 def Get_Content(str_temp,url):
 2 
 3 html = getHTML_Text(url)
 4 
 5  
 6 
 7     for i in re.findall(u'[\u4e00-\u9fa5\(\)\《\》\——\;\,\。\:\“\”\!\?]+',html):
 8 
 9         str_temp = str_temp+i[:-3]
10 
11         str_temp = str_temp+'\n'
12 
13  
14 
15     with open('圣墟.txt', 'a') as f:
16 
17        
18 
19         Save_file(f,str_temp)
20 
21  
22 
23 def Save_file(f,str_temp):
24 
25     f.write(str_temp)

 

  这里我们用了一个比较复杂的正则表达式,简单来说就是匹配所有的中文文字和中文的一些常用标点符号,我们这里匹配的最后是以

  最后我爬取的小说内容大家可以看看:

 

  还有不足的地方就是我们这个还没有目录,于是我们把获取各章节的那个函数再改造一下,我们用BeautifulSoup的强大功能!

  根据网页中的html文本结构,很容易用BeautifulSoup把需要的信息提取出来。

 

 1 def Get_Catalog(ulist,url):
 2 
 3     html = getHTML_Text(url)
 4 
 5     soup = BeautifulSoup(html,'html.parser')
 6 
 7     for td in soup('tbody'):
 8 
 9         if isinstance(td,bs4.element.Tag):
10 
11             for i in td('a'):
12 
13                 if isinstance(i,bs4.element.Tag):
14 
15                     ulist.append([i.get('href'),i.get('title')])

 

           

  我们把tbody中的所有的标签用get()函数获取href和title的属性值,就是对应我们每个章节的专属url链接和章节名。

 

 1 def Get_Content(str_temp,url,title):
 2 
 3     html = getHTML_Text(url)
 4 
 5  
 6 
 7     str_temp = str_temp + title +'\n'
 8 
 9     for i in re.findall(u'[\u4e00-\u9fa5\(\)\《\》\——\;\,\。\:\“\”\!\?]+',html):
10 
11         str_temp = str_temp+i[:-3]
12 
13         str_temp = str_temp+'\n'
14 
15     with open('圣墟.txt', 'a') as f:
16 
17         Save_file(f,str_temp)

 

  相应的保存到文件的时候也需要保持我们爬取的章节名!

  最后看看我们的成品结果:

 

  已经有了章节名字,哈哈哈,这个项目的效果就达到了,但是速度上还是有点慢,这个还需要优化一下,但总体上已经实现了我们想要的功能。

  本讲全代码:

  第一版(没有章节名)

 1 import requests
 2 
 3 import re
 4 
 5  
 6 
 7 def getHTML_Text(url):
 8 
 9     try:
10 
11         r = requests.get(url,timeout = 20)
12 
13         r.raise_for_status() #如果状态不是200,则产生异常
14 
15         r.encoding = r.apparent_encoding
16 
17         return r.text
18 
19     except:
20 
21         return '产生异常'
22 
23    
24 
25 def Get_Catalog(ulist,url):
26 
27     html = getHTML_Text(url)
28 
29     for i in re.findall(r'\d+.html',html):
30 
31         ulist.append(i)
32 
33 def Get_Content(str_temp,url):
34 
35 html = getHTML_Text(url)
36 
37  
38 
39     for i in re.findall(u'[\u4e00-\u9fa5\(\)\《\》\——\;\,\。\:\“\”\!\?]+',html):
40 
41         str_temp = str_temp+i[:-3]
42 
43         str_temp = str_temp+'\n'
44 
45  
46 
47     with open('圣墟.txt', 'a') as f:
48 
49        
50 
51         Save_file(f,str_temp)
52 
53  
54 
55 def Save_file(f,str_temp):
56 
57     f.write(str_temp)
58 
59    
60 
61 def main():
62 
63     url = 'http://www.liushuba.com/files/article/html/60/60255/'
64 
65     catalog_url = []
66 
67     Get_Catalog(catalog_url,url)
68 
69    
70 
71     for i in catalog_url:
72 
73             str_temp = ''
74 
75             Get_Content(str_temp,url+i)
76 
77  
78 
79 if __name__ == '__main__':
80 
81 main()

 

  第二版(有章节名)

 1 import requests
 2 
 3 from bs4 import BeautifulSoup
 4 
 5 import bs4
 6 
 7 import re
 8 
 9  
10 
11 def getHTML_Text(url):
12 
13     try:
14 
15         r = requests.get(url,timeout = 20)
16 
17         r.raise_for_status() #如果状态不是200,则产生异常
18 
19         r.encoding = r.apparent_encoding
20 
21         return r.text
22 
23     except:
24 
25         return '产生异常'
26 
27    
28 
29    
30 
31 def Get_Catalog(ulist,url):
32 
33     html = getHTML_Text(url)
34 
35     soup = BeautifulSoup(html,'html.parser')
36 
37     for td in soup('tbody'):
38 
39         if isinstance(td,bs4.element.Tag):
40 
41             for i in td('a'):
42 
43                 if isinstance(i,bs4.element.Tag):
44 
45                     ulist.append([i.get('href'),i.get('title')])
46 
47            
48 
49 def Get_Content(str_temp,url,title):
50 
51     html = getHTML_Text(url)
52 
53  
54 
55     str_temp = str_temp + title +'\n'
56 
57     for i in re.findall(u'[\u4e00-\u9fa5\(\)\《\》\——\;\,\。\:\“\”\!\?]+',html):
58 
59         str_temp = str_temp+i[:-3]
60 
61         str_temp = str_temp+'\n'
62 
63     with open('圣墟.txt', 'a') as f:
64 
65         Save_file(f,str_temp)
66 
67  
68 
69 def Save_file(f,str_temp):
70 
71     f.write(str_temp)
72 
73    
74 
75 def main():
76 
77     url = 'http://www.liushuba.com/files/article/html/60/60255/'
78 
79     catalog_url = []
80 
81     Get_Catalog(catalog_url,url)
82 
83  
84 
85     for i in catalog_url:
86 
87             str_temp = ''
88 
89             Get_Content(str_temp,url+i[0],i[1])
90 
91  
92 
93 if __name__ == '__main__':
94 
95     main()

  本讲到此结束,也就标志着Python简单爬虫就到此结束了,我只是简单讲述了爬虫的一些代码运用和一些实战项目,还有爬虫的运行机理,希望对大家有帮助,谢谢观看。


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
author-avatar
mobiledu2502878565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有