那么利用正则表达式很难再清理掉这些代码。先不管这些,我们这节课还是用上一次学到的方法爬取某学校的校务公开内容。
一、代码分列式解释
第一部分代码
第二部分代码
第三部分代码
第四部分
第五部分
第六部分
第七部分
第八部分
二、框架分析
一共有以上8个部分的代码。
第一部分是导入库模块,没什么好说的
第二部分是设置一个常量,其实如果不设置也无所谓,大不了在后面的代码写这个量。
第三部分
def hq_yuandaima(url): ydm = requests.get(url) return ydm.content.decode()
这个函数意思就是,你给个url网址,它就返回该网址下网页的源代码,实际上在本爬取的过程中,它用到了两次,一次是获取的目录页的源代码,一次是获取的具体内容页的源代码。
第四部分
def hq_ljlb(ydm): ljlb=[] quda_ydm = re.findall('newArtical">(.*?) class="page"',ydm,re.S)[0] zhuaxiao_ydm = re.findall('href="(.*?)"',quda_ydm,re.S) for url in zhuaxiao_ydm: ljlb.append(qianzhui + url) return ljlbz
这个函数是为了从目录页的源代码里获取每一条信息的绝对网址,先把ljlb设置成一个空列表,然后取大,聚焦到有用的那一部分源代码,然后抓小,就抓相对路径的网址,
第五部分
def hq_btnr(ydm): bt = re.search('<h6>(.*?)</h6>',ydm,re.S).group(1) nr = re.search('section(.*?)fanye',ydm,re.S).group(1) return bt,nr
这个函数是从内容页获取该篇章的主题,以及正文,返回主题和正文的内容
第六部分
def save(btt,nrr): os.makedirs('南京小学',exist_ok=True) with open(os.path.join('南京小学',btt + '.txt'),'w',encoding='utf-8') as f: f.write(nrr)
这个函数是保存到本地,两个参数分别是标题,和内容,标题赋值给txt文件,内容写入
第七部分
def hq_zwbtnr(url): muluyeydm = hq_yuandaima(url) bbt,nnr = hq_btnr(muluyeydm) save(bbt,nnr)
这个函数开始调用之前的那几个函数了,第二行开始,把网址是url的提取出来源代码给muluyedm,第三行,然后调用第五部分代码的函数,从源代码中提取出来标题和内容,第四行,调用第六部分的函数将第三行获取到的值,赋值到第六部分的函数,保存到本地。
也就是说这个函数是从网址获取源代码,从源代码获取标题和内容,讲标题和内容用第六部分函数的方法保存到本地,也就是说这个第七部分只是内容页运行, 目录页不运行,毕竟目录页无法返回内容。
第八部分
if __name__ == '__main__': muluyeydm = hq_yuandaima(ksurl) ljlb = hq_ljlb(muluyeydm) pool = Pool(4) pool.map(hq_zwbtnr,ljlb)
运行函数了,如果把爬取数据这件事比喻成浇灌庄稼,那前面七步相当于在挖一条沟,这个第八部分才是向沟里注水,水按照挖好的沟流淌,最终达成灌溉的目的。
第一行就是运行代码
第二行,把ksurl网页的源码通过第三部分的函数提取出来给muluyeydm,这里的ksurl就是目录页的网址,意思就是提取目录页的源代码
第三行,就是从第二行的源代码里利用第四部分的函数提取出每一个链接的绝对网址赋值给ljlb,留着最后一行用
第四行,开启四个线程
第五行,map里面的参数,第一个是函数,第七部分的函数,后面不要括号,参数就是第三行提取出来的所有网址。第七部分的函数就是保存到本地,意思就是,每一个内容页的绝对网址,提取出标题和内容,保存到本地。
全部代码