解析模塊 1、數(shù)據(jù)的分類 1、結(jié)構(gòu)化數(shù)據(jù) 特點(diǎn):有固定的格式,如:HTML、XML 2、非結(jié)構(gòu)化數(shù)據(jù) 示例:圖片、音頻、視頻,這類數(shù)據(jù)以二進(jìn)制方式存儲 2、正則表達(dá)式 re 1、使用流程 1、創(chuàng)建編譯對象 :p = re.compile('正則表達(dá)式') 2、對字符串進(jìn)行匹配 :r = p.match('字符串') 3、獲取匹配結(jié)果 :r.group() 2、常用方法 1、match(html) : 字符串開頭的第1個(gè),返回對象 2、search(html): 從開始往后找,匹配第1個(gè),返回對象 3、findall(html) : 所有全部匹配,返回列表 3、表達(dá)式 . : 匹配任意字符(不包括\n) \d : 數(shù)字 \s : 空白字符 \S : 非空白字符 \w : 字母、數(shù)字、_ [...] : 包含[]內(nèi)容 :A[BCD]E --> ABE ACE ADE * : 0次或多次 ? : 0次或1次 + : 1次或多次 {m}: m次 {m,n} : m-n次, AB{1,3}C ->ABC ABBC ABBBC 4、貪婪匹配和非貪婪匹配 貪婪匹配(.*) : 在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配* 非貪婪匹配(.*?) :在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配* import re
html = """<div><p>仰天大笑出門去</p></div>
<div><p>成也風(fēng)云,敗也風(fēng)云</p></div>
"""
# 貪婪匹配,re.S使 . 能匹配\n在內(nèi)的所有字符
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 re
s = "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、內(nèi)涵段子腦筋急轉(zhuǎn)彎抓取import urllib.request
import re
class NeihanSpider:
def __init__(self):
self.headers = {"User-Agent":"Mozilla/5.0"}
self.baseurl = "https://www./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)
# 保存數(shù)據(jù)
def writePage(self,r_list):
for r_tuple in r_list:
for r_str in r_tuple:
with open("急轉(zhuǎn)彎.txt","a",encoding="gb18030") as f:
f.write(r_str.strip() + "\n")
# 每個(gè)急轉(zhuǎn)彎之間有兩個(gè)空行
with open("急轉(zhuǎn)彎.txt","a") as f:
f.write("\n\n")
# 主函數(shù)
def workOn(self):
self.getPage(self.baseurl)
while True:
c = input("成功,是否繼續(xù)(y/n):")
if c.strip().lower() == "y":
self.page += 1
url = self.baseurl + "index_" + str(self.page) + ".html"
self.getPage(url)
else:
print("爬取結(jié)束,謝謝使用本爬蟲")
break
if __name__ == "__main__":
spider = NeihanSpider()
spider.workOn()
網(wǎng)址 :http://www. 1、步驟 1、找URL規(guī)律 第1頁:https://www./njjzw/ 第2頁:https://www./njjzw/index_2.html 2、用正則匹配出題目和答案 3、寫代碼 1、發(fā)請求 2、用正則解析 <div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div> 3、保存 4、貓眼電影top100榜單,存到csv文件里import urllib.request
import re
import csv
class 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:///board/4?offset="
self.offset = 0
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="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>',re.S)
r_list = p.findall(html)
# r_list:[("霸王別姬","張國榮","1993"),(),()]
self.writeTocsv(r_list)
# 保存數(shù)據(jù)
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)
# 主函數(shù)
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 += 1
self.offset = (self.page - 1)*10
else:
print("爬取結(jié)束")
break
if __name__ == "__main__":
spider = MaoyanSpider()
spider.workOn()
網(wǎng)址 :貓眼電影 - 榜單 - top100榜 目標(biāo) :抓取電影名、主演、上映時(shí)間 1、知識點(diǎn) 1、csv模塊的使用流程 1、打開csv文件 with open("測試.csv","a",newline="") as f: 2、初始化寫入對象 writer = csv.writer(f) 3、寫入數(shù)據(jù)(列表) writer.writerow([列表]) 2、準(zhǔn)備工作 1、找URL規(guī)律 第1頁:http:///board/4?offset=0 第2頁:http:///board/4?offset=10 第n頁:offset=(n-1)*10 2、寫正則表達(dá)式 <div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p> 3、寫代碼 數(shù)據(jù)持久化存儲1、存入mongodb數(shù)據(jù)庫(pymongo模塊回顧) # 創(chuàng)建連接對象 conn = pymongo.MongoClient("localhost",27017) # 創(chuàng)建數(shù)據(jù)庫對象 db = conn.庫名 # 創(chuàng)建集合對象 myset = db.集合名 # 插入數(shù)據(jù) myset.insert(字典) >>>show dbs >>>use 庫名 >>>show collections >>>db.集合名.find().pretty() >>>db.dropDatabase() >>>db.集合名.count() 2、存入MySQL數(shù)據(jù)庫(pymysql模塊回顧)3、requests模塊 1、安裝 Anaconda Prompt : conda install requests Windows cmd : python -m pip install requests ## python -m 是以管理員身份執(zhí)行pip安裝命令 Ubuntu : sudo pip3 install requests 2、常用方法 1、requests.get(url,headers=headers) 發(fā)起請求,并獲取響應(yīng)對象 2、響應(yīng)對象res的屬性 1、res.text : 字符串 2、res.content : 字節(jié)流 3、res.encoding: 指定字符編碼 (ISO-8859-1) ## res.encoding = "utf-8" 4、res.status_code : 響應(yīng)碼 5、res.url : 實(shí)際數(shù)據(jù)的URL 3、get()使用場景 1、沒有查詢參數(shù) res = requests.get(url,headers=headers) 2、有查詢參數(shù)(params) res = requests.get(url,params=params,headers=headers)
|