【复习】利用正则表达式爬取网站的信息

上一篇文章提到了正则表达式爬取的某小说网站的小说,但是这种爬取的方法是非常有限的,比如,正文部分必须干净,只有一两个<p>或者<br>的标签,如果是这样的

那么利用正则表达式很难再清理掉这些代码。先不管这些,我们这节课还是用上一次学到的方法爬取某学校的校务公开内容。

一、代码分列式解释

第一部分代码

import re #正则表达式的模块,用来从源代码中提取有用的信息
import os #文件操作模块,用来打开写入
import requests #获取网页代码的库模块
from multiprocessing.dummy import Pool #开启线程

第二部分代码

qianzhui = 'http://njglesx.njgljy.com'
ksurl='http://njglesx.njgljy.com/NewList-1.aspx'

第三部分代码

def hq_yuandaima(url):
    ydm = requests.get(url)
    return ydm.content.decode()

第四部分

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 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)

第七部分

def hq_zwbtnr(url):
    muluyeydm = hq_yuandaima(url)
    bbt,nnr = hq_btnr(muluyeydm)
    save(bbt,nnr)

第八部分

if __name__ == '__main__':
    muluyeydm = hq_yuandaima(ksurl)
    ljlb = hq_ljlb(muluyeydm)
    pool = Pool(4)
    pool.map(hq_zwbtnr,ljlb)

二、框架分析

一共有以上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里面的参数,第一个是函数,第七部分的函数,后面不要括号,参数就是第三行提取出来的所有网址。第七部分的函数就是保存到本地,意思就是,每一个内容页的绝对网址,提取出标题和内容,保存到本地。

全部代码

# encoding: utf-8
# @File  : 爬取某小学信息练习.py
# @Author: 龟仙岛
# @Date  :  2024/07/26/上午10:46
# @Desc :复习一下爬取小说的代码,

import re #正则表达式的模块,用来从源代码中提取有用的信息
import os #文件操作模块,用来打开写入
import requests #获取网页代码的库模块
from multiprocessing.dummy import Pool #开启线程

qianzhui = 'http://njglesx.njgljy.com'
ksurl='http://njglesx.njgljy.com/NewList-1.aspx'

def hq_yuandaima(url):
    ydm = requests.get(url)
    return ydm.content.decode()

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 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)

def hq_zwbtnr(url):
    muluyeydm = hq_yuandaima(url)
    bbt,nnr = hq_btnr(muluyeydm)
    save(bbt,nnr)

if __name__ == '__main__':
    muluyeydm = hq_yuandaima(ksurl)
    ljlb = hq_ljlb(muluyeydm)
    pool = Pool(4)
    pool.map(hq_zwbtnr,ljlb)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值