100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子

Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子

时间:2021-06-22 17:35:57

相关推荐

Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子

最近在学爬虫,这里用实例来与大家分享一下我学习的经验。

这里讲一个爬取静态网页内容的实例,Python一般利用正则表达式爬取静态静态网页的内容,而且因为静态网页源代码固定,不会发生变化,所以比较简单,这里选内涵段子吧作为例子。

内涵段子吧里的段子分为很多页,大家可以点击每一页,观察一下网址的变化,最后会发现每一页的url地址都遵循一个规则:

/article/list_5_"+page+".html"

page就是每一页在网页中的页码,比如第六页的内容,url地址是:

/article/list_5_6.html

给大家看一下网页的内容(第六页):

右击网页空白处,点击“查看网页源代码”:

我们的目标是把段子爬下来,可以发现,每个段子都可以找到一个特殊标记来作为开头和结尾:

我们的正则表达式就可以根据这个规则来进行编写:

#创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容pattern = pile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)

前期的准备工作都做完了,下面讲解代码。

现在一般项目的代码都采用模块化编程,因为这样可以降低代码间的耦合度并且易于扩展功能,我们的代码最好也进行模块化编程。

第一步,导入所需要的库文件:

from urllib import requestimport re

注意:我这里用的是Python3,Python2需要导入的库文件是urllib2,urllib2.函数()==urllib.request.函数(),函数名是一样的。

第二步,需要找到网页并下载网页中的所有内容:

def load_page(self,page):"""下载页面:return:"""#url地址url = "/article/list_5_" + str(self.page) + ".html"#报头,模拟网页点击headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}#构建请求req = request.Request(url,headers=headers)#发送请求并接收网页返回值response = request.urlopen(req)#获得网页全部内容html = response.read()#创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容pattern = pile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)#转码html_tran = html.decode(encoding="gbk", errors="strict")#讲正则表达式对象应用到HTML源码,获得目标内容(段子)content_list = pattern.findall(html_tran)#调用deal_page处理段子里的杂七杂八的东西self.deal_page(content_list)

第二步,编写代码处理段子里杂七杂八的东西:

def deal_page(self,content_list):"""处理每页的段子content_list:煤业的段子列表集合:return:"""for content in content_list:#将每个段子挨个处理content = content.replace("<p>","").replace("</p>","").replace("<br>","").replace("<br />","").replace("&ldquo;","").replace("&rdquo;","")#处理完后调用write_page()函数将每个段子写入文件内self.write_page(content)

第三步,将处理好的内容写到文件里:

def write_page(self,content):"""把网页内容逐个写到文件中:return:"""#写入文件,a+为在原有的文件里追加,如果没有这个文件会自动创建with open("duanzi.txt","a+") as f:print("正在写入数据......")f.write(content)

至此,代码的主体部分就完成了,下面贴完整的代码:

from urllib import requestimport reimport timeclass Spider:def __init__(self):#初始化页面起始页码self.page = 1#如果是True继续爬取self.switch = Truedef load_page(self,page):"""下载页面:return:"""#url地址url = "/article/list_5_" + str(self.page) + ".html"#报头,模拟网页点击headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}#构建请求req = request.Request(url,headers=headers)#发送请求并接收网页返回值response = request.urlopen(req)#获得网页内容html = response.read()#创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容pattern = pile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)#转码html_tran = html.decode(encoding="gbk", errors="strict")#讲正则表达式对象应用到HTML源码,获得目标内容(段子)content_list = pattern.findall(html_tran)#调用deal_page处理段子里的杂七杂八的东西self.deal_page(content_list)def deal_page(self,content_list):"""处理每页的段子content_list:每页的段子列表集合:return:"""for content in content_list:#将每个段子挨个处理content = content.replace("<p>","").replace("</p>","").replace("<br>","").replace("<br />","").replace("&ldquo;","").replace("&rdquo;","")#处理完后调用write_page()函数将每个段子写入文件内self.write_page(content)def write_page(self,content):"""把网页内容逐个写到文件中:return:"""#写入文件,a+为在原有的文件里追加,如果没有这个文件会自动创建with open("duanzi.txt","a+") as f:print("正在写入数据......")f.write(content)def start_work(self):"""控制爬虫运行:return:"""#循环执行,知道self.switch==Falsewhile self.switch==True:#用户控制爬取的次数command = input("如果继续爬取,请输入1,否则输入0:")if command=="0":self.switch=Falseprint("谢谢使用!")elif command=="1":self.load_page(self.page)#每次爬取完后页面自动加1self.page += 1else:print("输入错误!")if __name__ == "__main__":duanzi_spider = Spider()duanzi_spider.start_work()

这里我写的代码比较友好,所以代码量比较多,大家可以不用写这么多,只写出主体功能就可以了。爬取静态网页的套路比较固定:

第一步,要爬取的网页的URL地址;

第二步,查看网页源代码,看目标内容前后有什么特别的地方,利用这个特别的地方来写正则表达式;

第三步,构建请求;

第四步,发送请求并接收返回值;

第五步,利用第四步的返回值获取网页内容,利用正则表达式进行匹配。

至此,我们已经获得了我们想要的内容,接下来是打印还是往文件里写,就看大家怎么操作了。

如果有些的不对的地方还请大家批评指正。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。