python爬虫—爬取英文名以及正则表达式的介绍
爬取英文名:
一. 爬虫模块详细设计
(1)整体思路
对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个csv文件中;再读取csv文件当中的每个英文名链接,采用循环的方法读取每一个英文名链接,根据每个英文名链接爬取每个链接中的数据,保存在新的csv文件当中。
需要写一个爬取英文名链接的函数、将爬取的内容保存在csv文件的函数以及读取csv文件内容的函数、爬取英文名详情页内容的函数。
表5.3.1
函数名 | 作用 |
def get_nameLink(): | 爬取英文名链接 |
def save_to_csv(dict,filename): | 将爬取的内容以字典的形式保存在csv文件 |
def get_WebLinkcsv(name): | 读取csv文件的内容 |
def get_namedata(): | 根据链接爬取每个英文名的具体数据 |
(2)爬取英文名链接
首先观察A-Z英文名的网页的内容,发现每个字母都对应一个网站,刚打开网站只会显示三个模块的英文名,每个模块30个英文名;关于一个字母的更多的英文名是根据鼠标的移动再进行动态的加载才会在网页上显示出来;但每个字母的英文名不同的网页上显示。如图:
经观察,每个字母的所有英文名都可以根据页数来确定,可以不用动态爬取的方法,根据观察每个字母的英文名页数来确定每个字母英文名的数量进行爬取链接。链接格式为:
https://www.thebump.com/b/baby-girl-names-that-start-with-{letter}?sort_by=popular&page={number}&page_size=30&gender=&request-by-ajax=true
Letter表示A-Z的字母,number表示页数,page_size表示每个页面所显示的英文名数量为30个。
代码如下:
(3) 爬取详情页
打开某个英文名对应的详情页,右键点开查看需要爬取内容的审查元素,观察每个模块内容所对应的标签进行解析。经观察,有的英文名存在Celebrity模块,有的英文名不存在Celebrity模块,就需要进行判断,若存在就解析保存在csv文件中,不存在显示为空跳过,继续解析下一个内容。如图:
Abigail名字中就有Celebrity模块的内容,Annabelle名字中就没有这个Celebrity中的内容,这种情况下,就会存入空的内容。
代码如下:
采用try except进行异常处理。
(4)存储内容
采用字典的形式存入内容保存在csv文件当中。字典(dictionary)是Python中另一个非常有用的内置数据类型,列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取;字典是一种映射类型,字典用“{ }”标识,它是一个无序的键(key)、值(value)对集合,键(key)必须使用不可变类型。
def save_to_csv(dict,filename)函数表示存储数据,使用字典形式存储,因为本次实验数据较大,不能一次性爬取,所以在爬取内容的时候都是分开爬的,对于数据的存储也是采用追加的方式进行存取的。
如图:
(5)读取文件
读取文件主要是用来读取名字链接,根据名字链接进行详情页的爬取
二. 调试与测试
(1) 调试过程中遇到的问题
(1)在爬取关于A的英文名链接的时候,只出现了90个链接,剩下的爬不出来,但在网页中剩下的英文名可以根据鼠标的滑动进行加载出现在网页中,经观察可以根据此链接https://www.thebump.com/b/baby-girl-names-that-start-with-{letter}?sort_by=popular&page={number}&page_size=30&gender=&request-by-ajax=true,进行获取每个英文名的爬取以及对每个字母的英文名数量进行确认;用此url形式就相当于是进行翻页操作,每一页只有30个英文名。
(2)在运行的过程中会显示缩紧错误,但在观察过程中,并没有缩进的错误,在网上查询得只是因为在定义一个函数时,函数里面没有内容才会报此错误。
(3)在进行几次爬取过程中,会经常在某一个固定的地方停止爬取,经多次修改,最终发现是请求头的问题。
(2)爬取显示
爬取的内容会保存在csv文件当中,如图:
三 课程设计心得与体会
(1) 通过这次课程设计,使我更加扎实的掌握了有关Python方面的知识,在设计过程中,虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺以及经验不足。实践出真知,通过亲自动手设计,使我们找你哥我的知识不再是纸上谈兵。
(2) 过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在实践“过而能改,善莫大焉”的知行观。这次的课程设计终于顺利完成了,在设计中遇到了很多问题,最后在同学们的帮助下迎刃而解,这也告诉我们,在今后的社会发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一解决,只有这样才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人的认可。
(3) 课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门思辨课,给了我许多道,很多思。是我对抽象理论有了具体的认识。通过这次课程设计,我对正则表达式有了更深一步的理解运用,通过查询资料也了解了Python的爬虫原理。我认为,在这学期的实验中,不仅培养了独立思考、动手操作能力,在各种其他能力上也都有了提高。更重要的是,在课程设计学习中,我学会了很多学习方法,而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践。在学习、在实践。这对于我们的将来也有很大的帮助。
正则表达式:
一:什么是正则表达式
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
二:爬虫的四个主要步骤
- 明确目标 (要知道你准备在哪个范围或者网站去搜索)
- 爬 (将所有的网站的内容全部爬下来)
- 取 (过滤和匹配我们需要的数据,去掉没用的数据)
- 处理数据(按照我们想要的方式存储和使用)
三:正则表达式匹配规则
. | 代表任意字符 |
\ | |
[ ] | 匹配内部的任一字符或子表达式 |
[^] | 对字符集和取非 |
- | 定义一个区间 |
\ | 对下一字符取非(通常是普通变特殊,特殊变普通) |
* | 匹配前面的字符或者子表达式0次或多次 |
*? | 惰性匹配上一个 |
+ | 匹配前一个字符或子表达式一次或多次 |
+? | 惰性匹配上一个 |
? | 匹配前一个字符或子表达式0次或1次重复 |
{n} | 匹配前一个字符或子表达式 |
{m,n} | 匹配前一个字符或子表达式至少m次至多n次 |
{n,} | 匹配前一个字符或者子表达式至少n次 |
{n,}? | 前一个的惰性匹配 |
^ | 匹配字符串的开头 |
\A | 匹配字符串开头 |
$ | 匹配字符串结束 |
[\b] | 退格字符 |
\c | 匹配一个控制字符 |
\d | 匹配任意数字 |
\D | 匹配数字以外的字符 |
\t | 匹配制表符 |
\w | 匹配任意数字字母下划线 |
\W | 不匹配数字字母下划线 |
四.正则表达式例子
学习基础的例子,可以参见博客,个人觉得比较详细:https://blog.csdn.net/weixin_44258187/article/details/85307979