一.爬蟲是什麼?css
二.爬蟲的基本流程html
三.請求與響應python
四.Requestmysql
五.Responselinux
六.總結web
一爬蟲是什麼?正則表達式
1、什麼是互聯網? 互聯網是由網絡設備(網線,路由器,交換機,防火牆等等)和一臺臺計算機鏈接而成,像一張網同樣。 2、互聯網創建的目的? 互聯網的核心價值在於數據的共享/傳遞:數據是存放於一臺臺計算機上的,而將計算機互聯到一塊兒的目的就是爲了可以方便彼此之間的數據共享/傳遞,不然你只能拿U盤去別人的計算機上拷貝數據了。 3、什麼是上網?爬蟲要作的是什麼? 咱們所謂的上網即是由用戶端計算機發送請求給目標計算機,將目標計算機的數據下載到本地的過程。 3.1 只不過,用戶獲取網絡數據的方式是: 瀏覽器提交請求->下載網頁代碼->解析/渲染成頁面。 3.2 而爬蟲程序要作的就是: 模擬瀏覽器發送請求->下載網頁代碼->只提取有用的數據->存放於數據庫或文件中 3.1與3.2的區別在於: 咱們的爬蟲程序只提取網頁代碼中對咱們有用的數據 4、總結爬蟲 4.1 爬蟲的比喻: 若是咱們把互聯網比做一張大的蜘蛛網,那一臺計算機上的數據即是蜘蛛網上的一個獵物,而爬蟲程序就是一隻小蜘蛛,沿着蜘蛛網抓取本身想要的獵物/數據 4.2 爬蟲的定義: 向網站發起請求,獲取資源後分析並提取有用數據的程序 4.3 爬蟲的價值: 互聯網中最有價值的即是數據,好比天貓商城的商品信息,鏈家網的租房信息,雪球網的證券投資信息等等,這些數據都表明了各個行業的真金白銀,能夠說,誰掌握了行業內的第一手數據,誰就成了整個行業的主宰,若是把整個互聯網的數據比喻爲一座寶藏,那咱們的爬蟲課程就是來教你們如何來高效地挖掘這些寶藏,掌握了爬蟲技能,你就成了全部互聯網信息公司幕後的老闆,換言之,它們都在免費爲你提供有價值的數據。 複製代碼
二爬蟲的基本流程sql
#一、發起請求 使用http庫向目標站點發起請求,即發送一個Request Request包含:請求頭、請求體等 #二、獲取響應內容 若是服務器能正常響應,則會獲得一個Response Response包含:html,json,圖片,視頻等 #三、解析內容 解析html數據:正則表達式,第三方解析庫如Beautifulsoup,pyquery等 解析json數據:json模塊 解析二進制數據:以b的方式寫入文件 #四、保存數據 數據庫 文件
三請求與響應shell
#http協議:http://www.cnblogs.com/linhaifeng/articles/8243379.html #Request:用戶將本身的信息經過瀏覽器(socket client)發送給服務器(socket server) #Response:服務器接收請求,分析用戶發來的請求信息,而後返回數據(返回的數據中可能包含其餘連接,如:圖片,js,css等) #ps:瀏覽器在接收Response後,會解析其內容來顯示給用戶,而爬蟲程序在模擬瀏覽器發送請求而後接收Response後,是要提取其中的有用數據。
四.Request數據庫
#一、請求方式: 經常使用的請求方式:GET,POST 其餘請求方式:HEAD,PUT,DELETE,OPTHONS ps:用瀏覽器演示get與post的區別,(用登陸演示post) post與get請求最終都會拼接成這種形式:k1=xxx&k2=yyy&k3=zzz post請求的參數放在請求體內: 可用瀏覽器查看,存放於form data內 get請求的參數直接放在url後 #二、請求url url全稱統一資源定位符,如一個網頁文檔,一張圖片 一個視頻等均可以用url惟一來肯定 url編碼 https://www.baidu.com/s?wd=圖片 圖片會被編碼(看示例代碼) 網頁的加載過程是: 加載一個網頁,一般都是先加載document文檔, 在解析document文檔的時候,遇到連接,則針對超連接發起下載圖片的請求 #三、請求頭 User-agent:請求頭中若是沒有user-agent客戶端配置, 服務端可能將你當作一個非法用戶 host cookies:cookie用來保存登陸信息 通常作爬蟲都會加上請求頭 #四、請求體 若是是get方式,請求體沒有內容 若是是post方式,請求體是format data ps: 1、登陸窗口,文件上傳等,信息都會被附加到請求體內 二、登陸,輸入錯誤的用戶名密碼,而後提交,就能夠看到post,正確登陸後頁面一般會跳轉,沒法捕捉到post
from urllib.parse import urlencode import requests headers={ 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Cookie':'H_WISE_SIDS=101556_115474_115442_114743_108373_100099_115725_106201_107320_115339_114797_115553_116093_115546_115625_115446_114329_115350_114275_116040_110085; PSTM=1494300712; BAIDUID=42FE2934E37AF7AD1FA31D8CC7006D45:FG=1; BIDUPSID=2996557DB2710279BD865C50F9A68615; MCITY=-%3A; __cfduid=da9f97dea6458ca26aa4278280752ebb01508939712; BDSFRCVID=PGLsJeCCxG3wt_3ZUrBLDfv2D_qBZSjAgcEe3J; H_BDCLCKID_SF=tJAOoCLytI03qn5zq4Oh-4oHhxoJq5QxbT7Z0l8KtfcNVJQs-lCMhbtp-l3GJPoLWK6hBKQmWIQHDnbsbq0M2tcQXR5-WROCte74KKJx-4PWeIJo5tKh04JbhUJiB5OLBan7Lq7xfDDbbDtmej_3-PC3ql6354Rj2C_X3b7EfKjIOtO_bfbT2MbyeqrNQlTkLIvXoITJQD_bEP3Fbfj2DPQ3KabZqjDjJbue_I05f-oqebT4btbMqRtthf5KeJ3KaKrKW5rJabC3hPJeKU6qLT5Xjh6B5qDfyDoAbKOt-IOjhb5hMpnx-p0njxQyaR3RL2Kj0p_EWpcxsCQqLUonDh8L3H7MJUntKjnRonTO5hvvhb6O3M7-XpOhDG0fJjtJJbksQJ5e24oqHP-kKPrV-4oH5MQy5toyHD7yWCvjWlT5OR5Jj6KMjMkb3xbz2fcpMIrjob8M5CQESInv3MA--fcLD2ch5-3eQgTI3fbIJJjWsq0x0-jle-bQypoa-U0j2COMahkMal7xO-QO05CaD53yDNDqtjn-5TIX_CjJbnA_Hn7zepoxebtpbt-qJJjzMerW_Mc8QUJBH4tR-T3keh-83xbnBT5KaKO2-RnPXbcWjt_lWh_bLf_kQN3TbxuO5bRiL66I0h6jDn3oyT3VXp0n54nTqjDHfRuDVItXf-L_qtDk-PnVeUP3DhbZKxtqtDKjXJ7X2fclHJ7z-R3IBPCD0tjk-6JnWncKaRcI3poiqKtmjJb6XJkl2HQ405OT-6-O0KJcbRodobAwhPJvyT8DXnO7-fRTfJuJ_DDMJDD3fP36q4QV-JIehmT22jnT32JeaJ5n0-nnhP3mBTbA3JDYX-Oh-jjRX56GhfO_0R3jsJKRy66jK4JKjHKet6vP; ispeed_lsm=0; H_PS_PSSID=1421_24558_21120_17001_24880_22072; BD_UPN=123253; H_PS_645EC=44be6I1wqYYVvyugm2gc3PK9PoSa26pxhzOVbeQrn2rRadHvKoI%2BCbN5K%2Bg; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598', 'Host':'www.baidu.com', 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'} # response=requests.get('https://www.baidu.com/s?'+urlencode({'wd':'美女'}),headers=headers) response=requests.get('https://www.baidu.com/s',params={'wd':'美女'},headers=headers) #params內部就是調用urlencode print(response.text)
5.Response
#一、響應狀態 200:表明成功 301:表明跳轉 404:文件不存在 403:權限 502:服務器錯誤 #二、Respone header set-cookie:可能有多個,是來告訴瀏覽器,把cookie保存下來 #三、preview就是網頁源代碼 最主要的部分,包含了請求資源的內容 如網頁html,圖片 二進制數據等
6.總結
#一、總結爬蟲流程: 爬取--->解析--->存儲 #二、爬蟲所需工具: 請求庫:requests,selenium 解析庫:正則,beautifulsoup,pyquery 存儲庫:文件,MySQL,Mongodb,Redis #三、爬蟲經常使用框架: scrapy
返回主頁 吾日三洗吾身,洗頭、洗臉、洗身體 博客園首頁新隨筆聯繫訂閱管理 隨筆 - 29 文章 - 80 評論 - 73 爬蟲基本原理 閱讀目錄 一 爬蟲是什麼 二 爬蟲的基本流程 三 請求與響應 四 Request 五 Response 六 總結 一 爬蟲是什麼 複製代碼 #一、什麼是互聯網? 互聯網是由網絡設備(網線,路由器,交換機,防火牆等等)和一臺臺計算機鏈接而成,像一張網同樣。 #二、互聯網創建的目的? 互聯網的核心價值在於數據的共享/傳遞:數據是存放於一臺臺計算機上的,而將計算機互聯到一塊兒的目的就是爲了可以方便彼此之間的數據共享/傳遞,不然你只能拿U盤去別人的計算機上拷貝數據了。 #三、什麼是上網?爬蟲要作的是什麼? 咱們所謂的上網即是由用戶端計算機發送請求給目標計算機,將目標計算機的數據下載到本地的過程。 #3.1 只不過,用戶獲取網絡數據的方式是: 瀏覽器提交請求->下載網頁代碼->解析/渲染成頁面。 #3.2 而爬蟲程序要作的就是: 模擬瀏覽器發送請求->下載網頁代碼->只提取有用的數據->存放於數據庫或文件中 #3.1與3.2的區別在於: 咱們的爬蟲程序只提取網頁代碼中對咱們有用的數據 #四、總結爬蟲 #4.1 爬蟲的比喻: 若是咱們把互聯網比做一張大的蜘蛛網,那一臺計算機上的數據即是蜘蛛網上的一個獵物,而爬蟲程序就是一隻小蜘蛛,沿着蜘蛛網抓取本身想要的獵物/數據 #4.2 爬蟲的定義: 向網站發起請求,獲取資源後分析並提取有用數據的程序 #4.3 爬蟲的價值: 互聯網中最有價值的即是數據,好比天貓商城的商品信息,鏈家網的租房信息,雪球網的證券投資信息等等,這些數據都表明了各個行業的真金白銀,能夠說,誰掌握了行業內的第一手數據,誰就成了整個行業的主宰,若是把整個互聯網的數據比喻爲一座寶藏,那咱們的爬蟲課程就是來教你們如何來高效地挖掘這些寶藏,掌握了爬蟲技能,你就成了全部互聯網信息公司幕後的老闆,換言之,它們都在免費爲你提供有價值的數據。 複製代碼 二 爬蟲的基本流程 複製代碼 #一、發起請求 使用http庫向目標站點發起請求,即發送一個Request Request包含:請求頭、請求體等 #二、獲取響應內容 若是服務器能正常響應,則會獲得一個Response Response包含:html,json,圖片,視頻等 #三、解析內容 解析html數據:正則表達式,第三方解析庫如Beautifulsoup,pyquery等 解析json數據:json模塊 解析二進制數據:以b的方式寫入文件 #四、保存數據 數據庫 文件 複製代碼 三 請求與響應 複製代碼 #http協議:http://www.cnblogs.com/linhaifeng/articles/8243379.html #Request:用戶將本身的信息經過瀏覽器(socket client)發送給服務器(socket server) #Response:服務器接收請求,分析用戶發來的請求信息,而後返回數據(返回的數據中可能包含其餘連接,如:圖片,js,css等) #ps:瀏覽器在接收Response後,會解析其內容來顯示給用戶,而爬蟲程序在模擬瀏覽器發送請求而後接收Response後,是要提取其中的有用數據。 複製代碼 四 Request 複製代碼 #一、請求方式: 經常使用的請求方式:GET,POST 其餘請求方式:HEAD,PUT,DELETE,OPTHONS ps:用瀏覽器演示get與post的區別,(用登陸演示post) post與get請求最終都會拼接成這種形式:k1=xxx&k2=yyy&k3=zzz post請求的參數放在請求體內: 可用瀏覽器查看,存放於form data內 get請求的參數直接放在url後 #二、請求url url全稱統一資源定位符,如一個網頁文檔,一張圖片 一個視頻等均可以用url惟一來肯定 url編碼 https://www.baidu.com/s?wd=圖片 圖片會被編碼(看示例代碼) 網頁的加載過程是: 加載一個網頁,一般都是先加載document文檔, 在解析document文檔的時候,遇到連接,則針對超連接發起下載圖片的請求 #三、請求頭 User-agent:請求頭中若是沒有user-agent客戶端配置, 服務端可能將你當作一個非法用戶 host cookies:cookie用來保存登陸信息 通常作爬蟲都會加上請求頭 #四、請求體 若是是get方式,請求體沒有內容 若是是post方式,請求體是format data ps: 1、登陸窗口,文件上傳等,信息都會被附加到請求體內 2、登陸,輸入錯誤的用戶名密碼,而後提交,就能夠看到post,正確登陸後頁面一般會跳轉,沒法捕捉到post 複製代碼 複製代碼 from urllib.parse import urlencode import requests headers={ 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Cookie':'H_WISE_SIDS=101556_115474_115442_114743_108373_100099_115725_106201_107320_115339_114797_115553_116093_115546_115625_115446_114329_115350_114275_116040_110085; PSTM=1494300712; BAIDUID=42FE2934E37AF7AD1FA31D8CC7006D45:FG=1; BIDUPSID=2996557DB2710279BD865C50F9A68615; MCITY=-%3A; __cfduid=da9f97dea6458ca26aa4278280752ebb01508939712; BDSFRCVID=PGLsJeCCxG3wt_3ZUrBLDfv2D_qBZSjAgcEe3J; H_BDCLCKID_SF=tJAOoCLytI03qn5zq4Oh-4oHhxoJq5QxbT7Z0l8KtfcNVJQs-lCMhbtp-l3GJPoLWK6hBKQmWIQHDnbsbq0M2tcQXR5-WROCte74KKJx-4PWeIJo5tKh04JbhUJiB5OLBan7Lq7xfDDbbDtmej_3-PC3ql6354Rj2C_X3b7EfKjIOtO_bfbT2MbyeqrNQlTkLIvXoITJQD_bEP3Fbfj2DPQ3KabZqjDjJbue_I05f-oqebT4btbMqRtthf5KeJ3KaKrKW5rJabC3hPJeKU6qLT5Xjh6B5qDfyDoAbKOt-IOjhb5hMpnx-p0njxQyaR3RL2Kj0p_EWpcxsCQqLUonDh8L3H7MJUntKjnRonTO5hvvhb6O3M7-XpOhDG0fJjtJJbksQJ5e24oqHP-kKPrV-4oH5MQy5toyHD7yWCvjWlT5OR5Jj6KMjMkb3xbz2fcpMIrjob8M5CQESInv3MA--fcLD2ch5-3eQgTI3fbIJJjWsq0x0-jle-bQypoa-U0j2COMahkMal7xO-QO05CaD53yDNDqtjn-5TIX_CjJbnA_Hn7zepoxebtpbt-qJJjzMerW_Mc8QUJBH4tR-T3keh-83xbnBT5KaKO2-RnPXbcWjt_lWh_bLf_kQN3TbxuO5bRiL66I0h6jDn3oyT3VXp0n54nTqjDHfRuDVItXf-L_qtDk-PnVeUP3DhbZKxtqtDKjXJ7X2fclHJ7z-R3IBPCD0tjk-6JnWncKaRcI3poiqKtmjJb6XJkl2HQ405OT-6-O0KJcbRodobAwhPJvyT8DXnO7-fRTfJuJ_DDMJDD3fP36q4QV-JIehmT22jnT32JeaJ5n0-nnhP3mBTbA3JDYX-Oh-jjRX56GhfO_0R3jsJKRy66jK4JKjHKet6vP; ispeed_lsm=0; H_PS_PSSID=1421_24558_21120_17001_24880_22072; BD_UPN=123253; H_PS_645EC=44be6I1wqYYVvyugm2gc3PK9PoSa26pxhzOVbeQrn2rRadHvKoI%2BCbN5K%2Bg; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598', 'Host':'www.baidu.com', 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'} # response=requests.get('https://www.baidu.com/s?'+urlencode({'wd':'美女'}),headers=headers) response=requests.get('https://www.baidu.com/s',params={'wd':'美女'},headers=headers) #params內部就是調用urlencode print(response.text) 複製代碼 五 Response 按 Ctrl+C 複製代碼 #一、響應狀態 200:表明成功 301:表明跳轉 404:文件不存在 403:權限 502:服務器錯誤 #二、Respone header set-cookie:可能有多個,是來告訴瀏覽器,把cookie保存下來 #三、preview就是網頁源代碼 最主要的部分,包含了請求資源的內容 如網頁html,圖片 二進制數據等 按 Ctrl+C 複製代碼 六 總結 按 Ctrl+C 複製代碼 #一、總結爬蟲流程: 爬取--->解析--->存儲 #二、爬蟲所需工具: 請求庫:requests,selenium 解析庫:正則,beautifulsoup,pyquery 存儲庫:文件,MySQL,Mongodb,Redis #三、爬蟲經常使用框架: scrapy 按 Ctrl+C 複製代碼 複製代碼 import requests import re import time import hashlib def get_page(url): print('GET %s' %url) try: response=requests.get(url) if response.status_code == 200: return response.content except Exception: pass def parse_index(res): obj=re.compile('class="items.*?<a href="(.*?)"',re.S) detail_urls=obj.findall(res.decode('gbk')) for detail_url in detail_urls: if not detail_url.startswith('http'): detail_url='http://www.xiaohuar.com'+detail_url yield detail_url def parse_detail(res): obj=re.compile('id="media".*?src="(.*?)"',re.S) res=obj.findall(res.decode('gbk')) if len(res) > 0: movie_url=res[0] return movie_url def save(movie_url): response=requests.get(movie_url,stream=False) if response.status_code == 200: m=hashlib.md5() m.update(('%s%s.mp4' %(movie_url,time.time())).encode('utf-8')) filename=m.hexdigest() with open(r'./movies/%s.mp4' %filename,'wb') as f: f.write(response.content) f.flush() def main(): index_url='http://www.xiaohuar.com/list-3-{0}.html' for i in range(5): print('*'*50,i) #爬取主頁面 index_page=get_page(index_url.format(i,)) #解析主頁面,拿到視頻所在的地址列表 detail_urls=parse_index(index_page) #循環爬取視頻頁 for detail_url in detail_urls: #爬取視頻頁 detail_page=get_page(detail_url) #拿到視頻的url movie_url=parse_detail(detail_page) if movie_url: #保存視頻 save(movie_url) if __name__ == '__main__': main() #併發爬取 from concurrent.futures import ThreadPoolExecutor import queue import requests import re import time import hashlib from threading import current_thread p=ThreadPoolExecutor(50) def get_page(url): print('%s GET %s' %(current_thread().getName(),url)) try: response=requests.get(url) if response.status_code == 200: return response.content except Exception as e: print(e) def parse_index(res): print('%s parse index ' %current_thread().getName()) res=res.result() obj=re.compile('class="items.*?<a href="(.*?)"',re.S) detail_urls=obj.findall(res.decode('gbk')) for detail_url in detail_urls: if not detail_url.startswith('http'): detail_url='http://www.xiaohuar.com'+detail_url p.submit(get_page,detail_url).add_done_callback(parse_detail) def parse_detail(res): print('%s parse detail ' %current_thread().getName()) res=res.result() obj=re.compile('id="media".*?src="(.*?)"',re.S) res=obj.findall(res.decode('gbk')) if len(res) > 0: movie_url=res[0] print('MOVIE_URL: ',movie_url) with open('db.txt','a') as f: f.write('%s\n' %movie_url) # save(movie_url) p.submit(save,movie_url) print('%s下載任務已經提交' %movie_url) def save(movie_url): print('%s SAVE: %s' %(current_thread().getName(),movie_url)) try: response=requests.get(movie_url,stream=False) if response.status_code == 200: m=hashlib.md5() m.update(('%s%s.mp4' %(movie_url,time.time())).encode('utf-8')) filename=m.hexdigest() with open(r'./movies/%s.mp4' %filename,'wb') as f: f.write(response.content) f.flush() except Exception as e: print(e) def main(): index_url='http://www.xiaohuar.com/list-3-{0}.html' for i in range(5): p.submit(get_page,index_url.format(i,)).add_done_callback(parse_index) if __name__ == '__main__': main() 複製代碼 好文要頂 關注我 收藏該文 linhaifeng 關注 - 0 粉絲 - 695 +加關注 0 0 « 上一篇:函數 » 下一篇:爬蟲性能相關 posted @ 2017-11-02 17:50 linhaifeng 閱讀(288) 評論(0) 編輯 收藏 刷新評論刷新頁面返回頂部 (評論功能已被禁用) 【推薦】超50萬VC++源碼: 大型工控、組態\仿真、建模CAD源碼2018! 【推薦】騰訊雲新用戶域名搶購1元起,抓緊搶購 ketang0108 最新IT新聞: · 微信遊戲孫春光:微信小遊戲與APP是雙贏的生態 · 雷軍:在職場成就一番事業的惟一機會是「選擇忠誠」和「勤奮」 · Google工程師稱他辭職是由於支持多元化 · CES最驚悚黑科技能重塑身體?假的:Netflix廣告而已 · 速度與激情:抖音的2017 » 更多新聞... 阿里雲C2-1208 最新知識庫文章: · 步入雲計算 · 以操做系統的角度述說線程與進程 · 軟件測試轉型之路 · 門內門外看招聘 · 大道至簡,職場上作人作事作管理 » 更多知識庫文章... 公告 林海峯的頭像 python開發交流羣 255012808 暱稱:linhaifeng 園齡:1年3個月 粉絲:695 關注:0 +加關注 < 2018年1月 > 日 一 二 三 四 五 六 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 隨筆分類 openstack系列(17) shell script(3) 編程基礎(4) 隨筆檔案 2018年1月 (1) 2017年8月 (1) 2017年4月 (3) 2017年3月 (11) 2017年2月 (6) 2017年1月 (7) 文章分類 python全棧之linux基礎(1) python全棧之操做系統(1) python全棧之網絡基礎(3) python開發之路 最新評論 1. Re:python基礎之socket編程 峯哥真jb屌 --berdergo 2. Re:Python開發之路 666 --wallisyan 3. Re:Python開發之路 寫得太好了 --wallisyan 4. Re:文件處理 老師 開車拉 --帶帶大師兄丶 5. Re:mysql五:索引原理與慢查詢優化 厲害了個人哥 --王大拿 閱讀排行榜 1. Python開發之路(18432) 2. 操做系統簡介(2662) 3. 計算機基礎系列一:計算機硬件(2192) 4. openstack系列閱讀目錄(2126) 5. Shell第二篇:正則表達式和文本處理工具(1702) 評論排行榜 1. Python開發之路(13) 2. openstack系列閱讀目錄(3) 3. 四:OVS+GRE之網絡節點(1) 4. glance系列二:glance部署及操做(1) 5. 計算機基礎系列一:計算機硬件(1) 推薦排行榜 1. Python開發之路(19) 2. 操做系統簡介(6) 3. 計算機基礎系列一:計算機硬件(5) 4. keystone系列一:keystone基礎(4) 5. nova系列二:kvm介紹(3) Copyright ©2018 linhaifeng