最近在学爬虫,这里用实例来与大家分享一下我学习的经验。
这里讲一个爬取静态网页内容的实例,Python一般利用正则表达式爬取静态静态网页的内容,而且因为静态网页源代码固定,不会发生变化,所以比较简单,这里选内涵段子吧作为例子。
内涵段子吧里的段子分为很多页,大家可以点击每一页,观察一下网址的变化
给大家看一下网页的内容(第六页):
右击网页空白处,点击“查看网页源代码”:
我们的目标是把段子爬下来,可以发现,每个段子都可以找到一个特殊标记来作为开头和结尾:
我们的正则表达式就可以根据这个规则来进行编写:
#创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容
pattern = re.compile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)
前期的准备工作都做完了,下面讲解代码。
现在一般项目的代码都采用模块化编程,因为这样可以降低代码间的耦合度并且易于扩展功能,我们的代码最好也进行模块化编程。
第一步,导入所需要的库文件:
from urllib import request
import re
注意:我这里用的是Python3,Python2需要导入的库文件是urllib2,urllib2.函数()==urllib.request.函数(),函数名是一样的。
第二步,需要找到网页并下载网页中的所有内容:
def load_page(self,page):
"""
下载页面
:return:
"""
#url地址
url = "https://www.neihan8.com/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 = re.compile(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("“","").replace("”","")
#处理完后调用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 request
import re
import time
class Spider:
def __init__(self):
#初始化页面起始页码
self.page = 1
#如果是True继续爬取
self.switch = True
def load_page(self,page):
"""
下载页面
:return:
"""
#url地址
url = "https://www.neihan8.com/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 = re.compile(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("“","").replace("”","")
#处理完后调用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==False
while self.switch==True:
#用户控制爬取的次数
command = input("如果继续爬取,请输入1,否则输入0:")
if command=="0":
self.switch=False
print("谢谢使用!")
elif command=="1":
self.load_page(self.page)
#每次爬取完后页面自动加1
self.page += 1
else:
print("输入错误!")
if __name__ == "__main__":
duanzi_spider = Spider()
duanzi_spider.start_work()
这里我写的代码比较友好,所以代码量比较多,大家可以不用写这么多,只写出主体功能就可以了。爬取静态网页的套路比较固定:
第一步,要爬取的网页的URL地址;
第二步,查看网页源代码,看目标内容前后有什么特别的地方,利用这个特别的地方来写正则表达式;
第三步,构建请求;
第四步,发送请求并接收返回值;
第五步,利用第四步的返回值获取网页内容,利用正则表达式进行匹配。
至此,我们已经获得了我们想要的内容,接下来是打印还是往文件里写,就看大家怎么操作了。
如果有些的不对的地方还请大家批评指正。