一.爬蟲html
1.介紹web
爬蟲就是經過編寫程序模擬瀏覽器上網,而後讓其去互聯網上抓取數據的過程正則表達式
2.分類編程
通用爬蟲: 通用爬蟲是搜索引擎(Baidu、Google、Yahoo等)「抓取系統」的重要組成部分json
聚焦爬蟲:聚焦爬蟲是根據指定的需求抓取網絡上指定的數據。瀏覽器
3.反爬蟲服務器
門戶網站經過相應的策略和技術手段,防止爬蟲程序進行網站數據的爬取。markdown
4.反反爬蟲網絡
爬蟲程序經過相應的策略和技術手段,破解門戶網站的反爬蟲手段,從而爬取到相應的數據。app
5.robots.txt協議
若是本身的門戶網站中的指定頁面中的數據不想讓爬蟲程序爬取到的話,那麼則能夠經過編寫一個robots.txt的協議文件來約束爬蟲程序的數據爬取。
二.jupyter notebook的使用
1.介紹
Jupyter Notebook是以網頁的形式打開,能夠在網頁頁面中直接編寫代碼和運行代碼,代碼的運行結果也會直接在代碼塊下顯示。如在編程過程當中須要編寫說明文檔,可在同一個頁面中直接編寫,便於做及時的說明和解釋。
2.組成部分
網頁應用
文檔
3.特色
編程時具備語法高亮、縮進、tab補全的功能。
可直接經過瀏覽器運行代碼,同時在代碼塊下方展現運行結果。
對代碼編寫說明文檔或語句時,支持Markdown語法。
4.安裝
5.運行
默認端口啓動
在終端中輸入如下命令:
jupyter notebook
指定端口啓動
jupyter notebook --port <port_number>
啓動服務器但不打開瀏覽器
jupyter notebook --no-browser
6.快捷鍵的使用
二.requests模塊
requests模塊代碼編寫的流程:
指定url
發起請求
獲取響應對象中的數據
持久化存儲
例子
爬取搜狗的頁面
import requests #1 url = 'https://www.sogou.com/' #2. response = requests.get(url=url) #3. page_text = response.text #4. with open('./sogou.html','w',encoding='utf-8') as fp: fp.write(page_text)
#需求:爬取搜狗指定詞條搜索後的頁面數據 import requests url = 'https://www.sogou.com/web' #封裝參數 wd = input('enter a word:') param = { 'query':wd } response = requests.get(url=url,params=param) page_text = response.content fileName = wd+'.html' with open(fileName,'wb') as fp: fp.write(page_text) print('over')
#爬取百度翻譯結果 url = 'https://fanyi.baidu.com/sug' wd = input('enter a word:') data = { 'kw':wd } response = requests.post(url=url,data=data) print(response.json()) #response.text : 字符串 #.content : 二進制 #.json() : 對象
#爬取豆瓣電影分類排行榜 https://movie.douban.com/中的電影詳情數據 url = 'https://movie.douban.com/j/chart/top_list' param = { "type": "5", "interval_id": "100:90", "action": '', "start": "60", "limit": "100", } movie_data = requests.get(url=url,params=param).json() print(movie_data)
User-Agent參數,簡稱爲UA,該參數的做用是用於代表本次請求載體的身份標識。
#需求:爬取國家藥品監督管理總局中基於中華人民共和國化妝品生產許可證相關數據http://125.35.6.84:81/xk/ #反爬機制:UA檢測 --> UA假裝 import requests url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' } id_list = [] for page in range(1,11): data = { "on": "true", "page": str(page), "pageSize": "15", "productName": "", "conditionType": "1", "applyname": "", "applysn": "", } json_data = requests.post(url=url,data=data,headers=headers).json() for dic in json_data['list']: id = dic['ID'] id_list.append(id) detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' for id in id_list: detail_data = { 'id':id } detail_json = requests.post(url=detail_url,data=detail_data,headers=headers).json() print(detail_json)
urllib是Python自帶的一個用於爬蟲的庫,其主要做用就是能夠經過代碼模擬瀏覽器發送請求。其常被用到的子模塊在Python3中的爲urllib.request和urllib.parse,在Python2中是urllib和urllib2。
#爬取照片 url = 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=806201715,3137077445&fm=26&gp=0.jpg' img_data = requests.get(url=url,headers=headers).content with open('./xiaohua.jpg','wb') as fp: fp.write(img_data)
用urllib
import urllib url = 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=806201715,3137077445&fm=26&gp=0.jpg' urllib.request.urlretrieve(url=url,filename='./123.jpg')
三.正則表達式
單字符: . : 除換行之外全部字符 [] :[aoe] [a-w] 匹配集合中任意一個字符 \d :數字 [0-9] \D : 非數字 \w :數字、字母、下劃線、中文 \W : 非\w \s :全部的空白字符包,括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。 \S : 非空白 數量修飾: * : 任意屢次 >=0 + : 至少1次 >=1 ? : 無關緊要 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次 {m,n} :m-n次 邊界: $ : 以某某結尾 ^ : 以某某開頭 分組: (ab) 貪婪模式: .* 非貪婪(惰性)模式: .*? re.I : 忽略大小寫 re.M :多行匹配 re.S :單行匹配 re.sub(正則表達式, 替換內容, 字符串)
import re string = '''fall in love with you i love you very much i love she i love her''' re.findall('^i.*',string,re.M)
import re
#匹配所有行 string1 = """細思極恐 你的隊友在看書 你的敵人在磨刀 你的閨蜜在減肥 隔壁老王在練腰 """ re.findall('.*',string1,re.S)
爬取糗事百科中全部的圖片進行保存
import requests import re import urllib import os url = 'https://www.qiushibaike.com/pic/page/%d/?s=5170552' # page = 1 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' } if not os.path.exists('./qiutu'): os.mkdir('./qiutu') start_page = int(input('enter a start pageNum:')) end_page = int(input('enter a end pageNum:')) for page in range(start_page,end_page+1): new_url = format(url%page) # print(new_url) page_text = requests.get(url=new_url,headers=headers).text img_url_list = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>',page_text,re.S) for img_url in img_url_list: img_url = 'https:'+img_url imgName = img_url.split('/')[-1] imgPath = 'qiutu/'+imgName urllib.request.urlretrieve(url=img_url,filename=imgPath) print(imgPath,'下載成功!') print('over!!!')