相关模块的安装
- 1.安装
requests
模块,在终端输入pip install requests
命令。使用requests
模块进行http请求,同时导入HTMLParser和re模块。
为了解决编码带来的困扰,默认使用utf8编码。
解析网页内容
1.网页的url是
http://www.gushiwen.org/gushi/tangshi.aspx
,该网页是个唐诗300首网页,里面有唐诗300首的标题和作者,点击某首唐诗进入其具体内容网页。我们想要抓取的内容是标题、作者、内容。-
2.利用谷歌的chrome浏览器查看网页源代码。需要抓取的源代码如下:
打开其中的一个div标签,显示如下:
所以我们先抓取外层的div标签,这几个并列的div标签都有一个class属性为guwencont2,识别出外层的标签后就可以抓取内层的a标签的内容,包含古诗的标题和作者。还需要抓取该古诗的url,即为href属性值,例如/GuShiWen_6299b969fb.aspx
,该内容拼接原始url为http://www.gushiwen.org
成http://www.gushiwen.org/GuShiWen_6299b969fb.aspx
即为具体内容网页。 -
3.来到古诗的具体内容网页,同样利用chrome的开发者工具显示源代码,显示如下:
内容在p标签中,有一个align属性为center。
4.分析完如何解析出标题作者和内容后,开始写代码。自定义一个解释器继承
HTMLParser
,在重写初始化函数__init__
时要先初始化父类
HTMLParser.__init__(self)
在初始化函数中定义一个字典,用于存储爬取到的标题作者和内容(1首诗对应一个字典),定义一个列表用于存储字典(列表中存储所有诗对应的字典)。定义几个标志位(用于标记上面分析的几个需要找到的标签),以及一个正则表达式(用于分离标题和作者)
-
定义一个解析属性函数,html标签中的属性和属性值在htmlparser解析器中是个tuple类型,返回属性名对应的属性值。
-
重写handle_starttag函数,该函数在查找到标签头自动调用,attrs包含该标签tag中所有的属性和属性值,类型是个列表,其中的元素都是tuple类型(属性名,属性值)。
-
重写handle_endtag函数,该函数在查找到标签末位自动调用
-
重写handle_data函数,该函数在查找到标签中的内容自动调用,利用正则表达式进行了匹配,如果匹配成功,匹配出来的组即为标题和作者。
- 5.实例化上面写的SongciParser类,传入原始url,使用
requests
获得响应,把响应的内容喂给实例化的解析器。
在主函数中执行如下代码
解析具体网页的内容
-
1.经过上面的解析,已经可以解析出唐诗300首的标题和作者,并且获得了每首古诗的url,接下来进入到具体古诗网页中获取内容。同样需要自定义一个解析器(继承HTMLParser)
-
2.加载每首古诗的url获取内容,进行了换行处理
在主函数中调用如下,这个只加载了前10首古诗
-
3.下面是运行的结果