本文主要是介绍Skr-Eric的爬虫课堂(二)——爬虫的解析模块和数据持久化存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
解析模块
1、数据的分类
1、结构化数据
特点:有固定的格式,如:HTML、XML
2、非结构化数据
示例:图片、音频、视频,这类数据以二进制方式存储
2、正则表达式 re
1、使用流程
1、创建编译对象 :p = re.compile('正则表达式')
2、对字符串进行匹配 :r = p.match('字符串')
3、获取匹配结果 :r.group()
2、常用方法
1、match(html) : 字符串开头的第1个,返回对象
2、search(html): 从开始往后找,匹配第1个,返回对象
3、findall(html) : 所有全部匹配,返回列表
3、表达式
. : 匹配任意字符(不包括\n)
\d : 数字
\s : 空白字符
\S : 非空白字符
\w : 字母、数字、_
[...] : 包含[]内容 :A[BCD]E --> ABE ACE ADE
* : 0次或多次
? : 0次或1次
+ : 1次或多次
{m}: m次
{m,n} : m-n次, AB{1,3}C ->ABC ABBC ABBBC
4、贪婪匹配和非贪婪匹配
贪婪匹配(.*) : 在整个表达式匹配成功的前提下,尽可能多的匹配*
非贪婪匹配(.*?) :在整个表达式匹配成功的前提下,尽可能少的匹配*
import rehtml = """<div><p>仰天大笑出门去</p></div>
<div><p>成也风云,败也风云</p></div>
"""
# 贪婪匹配,re.S使 . 能匹配\n在内的所有字符
p = re.compile('<div><p>.*</p></div>',re.S)
r = p.findall(html)
print(r)# 非贪婪匹配
p = re.compile('<div><p>.*?</p></div>',re.S)
r = p.findall(html)
print(r)
5、findall()的分组
import res = "A B C D"
p1 = re.compile('\w+\s+\w+')
r1 = p1.findall(s)
print(r1)# 第1步:['A B','C D']
# 第2步:['A','C']
p2 = re.compile('(\w+)\s+\w+')
r2 = p2.findall(s)
print(r2)# 第1步:['A B','C D']
# 第2步:[('A','B'),('C','D')]
p3 = re.compile('(\w+)\s+(\w+)')
r3 = p3.findall(s)
print(r3)
3、内涵段子脑筋急转弯抓取
import urllib.request
import reclass NeihanSpider:def __init__(self):self.headers = {"User-Agent":"Mozilla/5.0"}self.baseurl = "https://www.neihan8.com/njjzw/"self.page = 1# 获取页面def getPage(self,url):req = urllib.request.Request(url,headers=self.headers)res = urllib.request.urlopen(req) html = res.read().decode("utf-8")self.parsePage(html)# 解析页面def parsePage(self,html):p = re.compile('<div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>',re.S)r_list = p.findall(html)
# print(r_list)# r_list: [("二虎","公母"),(),()]self.writePage(r_list)# 保存数据def writePage(self,r_list):for r_tuple in r_list:for r_str in r_tuple:with open("急转弯.txt","a",encoding="gb18030") as f:f.write(r_str.strip() + "\n")# 每个急转弯之间有两个空行with open("急转弯.txt","a") as f:f.write("\n\n")# 主函数def workOn(self):self.getPage(self.baseurl)while True:c = input("成功,是否继续(y/n):")if c.strip().lower() == "y":self.page += 1url = self.baseurl + "index_" \+ str(self.page) + ".html"self.getPage(url)else:print("爬取结束,谢谢使用本爬虫")breakif __name__ == "__main__":spider = NeihanSpider()spider.workOn()
网址 :http://www.neihan8.com
1、步骤
1、找URL规律
第1页:https://www.neihan8.com/njjzw/
第2页:https://www.neihan8.com/njjzw/index_2.html
2、用正则匹配出题目和答案
3、写代码
1、发请求
2、用正则解析
<div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>
3、保存
4、猫眼电影top100榜单,存到csv文件里
import urllib.request
import re
import csvclass MaoyanSpider:def __init__(self):self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"}self.baseurl = "http://maoyan.com/board/4?offset="self.offset = 0self.page = 1# 获取页面def getPage(self,url):req = urllib.request.Request(url,headers=self.headers)res = urllib.request.urlopen(req)html = res.read().decode("utf-8")self.parsePage(html)# 解析页面def parsePage(self,html):p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>',re.S)r_list = p.findall(html)# r_list:[("霸王别姬","张国荣","1993"),(),()]self.writeTocsv(r_list)# 保存数据def writeTocsv(self,r_list):for r_tuple in r_list:
# L = list(r_tuple)L = [r_tuple[0].strip(),r_tuple[1].strip(),r_tuple[2].strip()]with open("猫眼电影.csv","a",newline="") as f:writer = csv.writer(f)writer.writerow(L)# 主函数def workOn(self):while True:c = input("爬按y,退出按q:")if c.strip().lower() == "y": url = self.baseurl + str(self.offset)self.getPage(url)self.page += 1self.offset = (self.page - 1)*10 else:print("爬取结束")breakif __name__ == "__main__":spider = MaoyanSpider()spider.workOn()
网址 :猫眼电影 - 榜单 - top100榜
目标 :抓取电影名、主演、上映时间
1、知识点
1、csv模块的使用流程
1、打开csv文件
with open("测试.csv","a",newline="") as f:
2、初始化写入对象
writer = csv.writer(f)
3、写入数据(列表)
writer.writerow([列表])
2、准备工作
1、找URL规律
第1页:http://maoyan.com/board/4?offset=0
第2页:http://maoyan.com/board/4?offset=10
第n页:offset=(n-1)*10
2、写正则表达式
<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>
3、写代码
数据持久化存储
1、存入mongodb数据库(pymongo模块回顾)
# 创建连接对象
conn = pymongo.MongoClient("localhost",27017)
# 创建数据库对象
db = conn.库名
# 创建集合对象
myset = db.集合名
# 插入数据
myset.insert(字典)
>>>show dbs
>>>use 库名
>>>show collections
>>>db.集合名.find().pretty()
>>>db.dropDatabase()
>>>db.集合名.count()
2、存入MySQL数据库(pymysql模块回顾)
3、requests模块
1、安装
Anaconda Prompt : conda install requests
Windows cmd : python -m pip install requests
## python -m 是以管理员身份执行pip安装命令
Ubuntu : sudo pip3 install requests
2、常用方法
1、requests.get(url,headers=headers)
发起请求,并获取响应对象
2、响应对象res的属性
1、res.text : 字符串
2、res.content : 字节流
3、res.encoding: 指定字符编码 (ISO-8859-1)
## res.encoding = "utf-8"
4、res.status_code : 响应码
5、res.url : 实际数据的URL
3、get()使用场景
1、没有查询参数
res = requests.get(url,headers=headers)
2、有查询参数(params)
res = requests.get(url,params=params,headers=headers)
想要看更多的课程请微信关注SkrEric的编程课堂
这篇关于Skr-Eric的爬虫课堂(二)——爬虫的解析模块和数据持久化存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!