断断续续学了Python一年左右,依然处在入门阶段……
对于大部分人来说,XXX从入门到精通,学着学着都变成了XXX从入门到放弃,我可能也是这个结局……但不希望是现在。
所以,开始我的第一个小小小项目——用Python抓取静态网页内容。(也不知道能不能称之为一个项目)
网页我选了自己之前发的一篇公众号文章:
我想要达到的结果是,将网页中的内容按顺序存入表格中,如下图:
然后我用了26行代码实现了这个结果……
本来22行就可以的,但是微信公众号文章的网址真是太长了,一个网址占了5行……
下面讲讲实现的过程。
导入模块
首先,需要导入需要用到的模块,「导入模块」使用的语句为 import 或 from...import :
import 模块名:导入一个模块,相当于导入的是一个文件夹。在调用它时,需要使用:模块名.函数名
from 模块名 import 函数名:导入一个模块中的一个函数,相当于导入了一个文件夹中的一个文件。当调用它时,可以直接使用 函数名。
导入的4个Python模块分别为:
① requests模块
作用:发送网络请求,返回响应数据。
② bs4模块
作用:对HTML格式进行分析,将复杂HTML文档转换为清晰的树形结构,配合requests库可以用于简单的爬虫。
③ re模块
作用:提供对正则表达式的支持。正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
④ csv模块
作用:csv文件格式是一种常用的文本格式,用以存储表格数据,包括数字或者字符。csv模块提供了常用的读写等功能。
新建文件
导入完模块以后,需要新建一个csv文件用于存储将要获取的数据。
这里使用了 open 语句来新建/打开文件,当要打开的文件“段子.csv”不存在时会自动新建一个以"段子"命名的csv文件。
用到的csv模块两个函数分别为:
csv.writer() 用于写入csv文件数据,返回一个对象。
writerow() 按行写入数据,一次写入一行。
获取网页内容,并写入文件
使用 requests.get 方法发送网络请求,获取指定网页的内容。
获取到html文档后,可以使用 print 语句查看一下内容,如下图所示:
然后,使用 bs4 模块中的 BeautifulSoup 函数,分析该html文档,并将其转换为树形结构,每一个节点都可以作为一个对象。
接下来,在文档中搜索我想要获取到的内容,分析它们出现的规律,确定匹配规则,即正则表达式。
在 <p style="text-align: center;">(\d{2})</p>(.*?)<br/> 这个表达式中,括号()中的内容为我需要的结果,这里获取了两部分内容,分别为序号和对应的句子。
同样的,可以使用 print 语句查看下匹配后的结果是否符合预期,如果不能正确匹配则需要对正则表达式进行调整。
使用 type 函数可以查看匹配后的结果是一个列表,使用 len 函数可以看到这个列表中有35个元素,最后输出整个列表进行查看。
接下来,可以使用 for 循环 遍历列表。
可以查看到列表中的每一个元素都是元组类型,每个元组中有2个元素。
在查看内容时可以发现,列表中序号的匹配结果对应每个元组中的第一个元素,完全满足需求,但句子的匹配部分 < > 中的内容是无效的、不需要的。所以,需要进一步处理。
使用 re 模块中的 sub 函数,将格式为 <任意字符> 的内容全部替换为空值,等同于删除无效字符。
将序号赋值给 num ,将替换后的句子(字符串)赋值给 word ,使用 print 输出最终结果如下图所示:
最后,确认匹配内容符合预期且无遗漏后,将它们按行依次写入文件“段子.csv”中。
整段代码编辑完成。运行它,获取的数据将写入csv文件,该文件自动存储的位置与代码文件所在位置相同,在同一个文件夹下:
在实践中遇到的几个问题
1、使用 requests 模块时,get 只是其中一种方式,其他的方式如 post ,与 get 有什么区别?
2、bs4 模块中 BeautifulSoup 的具体作用和使用方法是什么?
3、新建 csv 文件时,用到的 open 语句的参数有多个,它们分别起到什么作用?
4、Python中正则表达式如何写?数字、字母、字符等分别用什么表示?
这些问题将在下一篇解答。(或者下下篇……)
本文【抓取静态网页】代码分享地址
链接:
https://pan.baidu.com/s/1Ne6337bZu6y1xsHxv43QcA
提取码:
sagb
----------------- End -----------------
https://mp.weixin.qq.com/s/iY-sKxKlYrpvNJHFfq3eeA