参加服务外包大赛的缘故,项目中需要用到很初级的爬虫,现在项目完结,就来稍稍总结一下。
pythonIDE:pycharm
python version:3
用到的模块
import urllib
import bs4
import re
简单的说一下,
(1)urllib模块是用来获取网页的,就是把网页下载下来。对于静态网页,你把网页源代码下载下来后就可以按图索骥寻找到网页上所有你想获取的内容。
(2)bs4模块是用来解析网页的,网页下载下来后就是一堆源代码,想要直接获取信息很不方便(字符串操作)。所以这个时候用到了bs4模块中的beautifulsoup。用这个可以把源代码划归成树状结构,也就是你可以通过一些标签和正则表达式索引到你想要的内容。
(3)re模块就是正则表达式的部分,在页面中按一定条件查询你想要的特定内容很方便。
第一步:侦察目标网站
这是我找到的比较合适的网站。我需要分好类的小学、初中、高中的课标诗词,恰好都能在这里找到。话不多说,开始进一步侦查。
这是在点入“小学古诗”页面后呈现的内容。
网站直接将所有诗词的目录列出,这实在是很方便的设计,无论对于读者还是对于爬虫。因为我们可以在这个目录页把所有要爬取的具体诗词网页url一次性获取到,省去了反复寻找“下一首”的操作。
随便找一首诗点进去,观察一下页面结构。
我用的是火狐浏览器,点击查看元素,查看一下页面结构。
结构一目了然,我们需要的就是下面这个代码块:
<div class="contson" id="contsoneeb3869b6242">
鹅,鹅,鹅,曲项向天歌。<br>白毛浮绿水,红掌拨清波。
</div>
经过确定,class=“contson”这个类只被用来存储诗词内容,所以在获取信息时,按照这个特征去找就没问题了。
OK,现在开始准备编写。
2.编写爬虫
回顾一下爬虫最简单的结构:下载网页、解析网页、获取信息。
我根据这些需求写了几个方法:
-
根据参数中的url下载网页
def get_html(url):
response=urllib.request.urlopen(url)
html=response.read()
return html
如之前所说,这里返回的html便是网页的源代码了。
-
根据网页内容进行解析并获取信息
def get_poem(html):
soup=bs4.BeautifulSoup(html)
poem=soup.find(class_="contson").text
poem=poem.replace('\n','')
return poem
这里的soup.find(class_="contson")便是刚才观察到的储存诗词内容的块的特征了,find方法将会返回在本页面找到的第一个符合条件的标签(也就是我们需要的内容)。因为我们的存储格式不需要我们加换行符,于是我就用replace方法将其替换为了空字符。方法返回的poem就是我们需要的诗词内容了。
其实到这里基本逻辑就已经实现了,只需要填上合适的url,调用两个方法就可以获取到指定网页的诗词内容了。不过,懒惰终究是技术发展的第一生产力(狗头),一个个的填url未免太麻烦。于是,接下来继续。
-
获取所有目标诗词网页的url
def get_urls(html):
soup=bs4.BeautifulSoup(html)
urls=soup.find_all('a',href=re.compile("shiwenv"))
return urls
这里通过目录页把所有诗词的网页url收集起来,在爬取的时候通过一个简单的循环就可以把目录页中的所有诗词都遍历到。
find_all方法返回的是一个列表,即符合要求的所有标签。
-
调用方法开始爬取
type_list = {"xiaoxue","chuzhong","gaozhong"}
for type in type_list:
url = "https://so.gushiwen.org/gushi/{}.aspx".format(type)
url_list = get_urls(get_html(url))
for url in url_list:
url = url['href']
print(get_poem(get_html(url)))