1、結(jié)構(gòu)化數(shù)據(jù)
特點:有固定的格式,如:HTML、XML
2、非結(jié)構(gòu)化數(shù)據(jù)
示例:圖片、音頻、視頻,這類數(shù)據(jù)以二進(jìn)制方式存儲
1、使用流程
1、創(chuàng)建編譯對象 :p = re.compile('正則表達(dá)式')
2、對字符串進(jìn)行匹配 :r = p.match('字符串')
3、獲取匹配結(jié)果 :r.group()
2、常用方法
1、match(html) : 字符串開頭的第1個,返回對象
2、search(html): 從開始往后找,匹配第1個,返回對象
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、貪婪匹配和非貪婪匹配
貪婪匹配(.*) : 在整個表達(dá)式匹配成功的前提下,盡可能多的匹配*
非貪婪匹配(.*?) :在整個表達(dá)式匹配成功的前提下,盡可能少的匹配*
import rehtml = """<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 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)
import urllib.requestimport 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) # 保存數(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") # 每個急轉(zhuǎn)彎之間有兩個空行 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.neihan8.com
1、步驟
1、找URL規(guī)律
第1頁:https://www.neihan8.com/njjzw/
第2頁:https://www.neihan8.com/njjzw/index_2.html
2、用正則匹配出題目和答案
3、寫代碼
1、發(fā)請求
2、用正則解析
<div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>
3、保存
import urllib.requestimport reimport 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 = 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) :抓取電影名、主演、上映時間
1、知識點
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://maoyan.com/board/4?offset=0
第2頁:http://maoyan.com/board/4?offset=10
第n頁:offset=(n-1)*10
2、寫正則表達(dá)式
<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>
3、寫代碼
# 創(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()
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ù)據(jù)的URL
3、get()使用場景
1、沒有查詢參數(shù)
res = requests.get(url,headers=headers)
2、有查詢參數(shù)(params)
res = requests.get(url,params=params,headers=headers)