爬蟲
爬蟲的應用:
# 1.通用爬蟲:通用爬蟲是搜索引擎(Baidu、Google、Yahoo等)“抓取系統”的重要組成部分。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。 1)搜索引擎如何抓取互聯網上的網站數據? a)門戶網站主動向搜索引擎公司提供其網站的url b)搜索引擎公司與DNS服務商合作,獲取網站的url c)門戶網站主動掛靠在一些知名網站的友情鏈接中 # 2.聚焦爬蟲:聚焦爬蟲是根據指定的需求抓取網絡上指定的數據。 例如: 獲取豆瓣上電影的名稱和影評,而不是獲取整張頁面中所有的數據值。
爬蟲的基本流程:
request:
#1、請求方式: 常用的請求方式: GET,POST 其他請求方式: HEAD,PUT,DELETE,OPTHONS ps:用瀏覽器演示get與post的區別,(用登錄演示post) post與get請求最終都會拼接成這種形式: k1=xxx&k2=yyy&k3=zzz post請求的參數放在請求體內: 可用瀏覽器查看,存放於form data內 get請求的參數直接放在url後 #2、請求url url全稱統一資源定位符,如一個網頁文檔,一張圖片 一個視頻等都可以用url唯一來確定 url編碼: https://www.baidu.com/s?wd=圖片 圖片會被編碼(看示例代碼) 網頁的加載過程是: 加載一個網頁,通常都是先加載document文檔,在解析document文檔的時候,遇到鏈接,則針對超鏈接發起下載圖片的請求。 #3、請求頭 User-agent: 請求頭中如果沒有user-agent客戶端配置,服務端可能將你當做一個非法用戶。 Cookies: cookie用來保存登錄信息。 Referer: 瀏覽器上次訪問的網頁url 一般做爬蟲都會加上請求頭 #4、請求體 如果是get方式,請求體沒有內容 如果是post方式,請求體是format data ps: 1、登錄窗口,文件上傳等,信息都會被附加到請求體內 2、登錄,輸入錯誤的用戶名密碼,然後提交,就可以看到post,正確登錄後頁面通常會跳轉,無法捕捉到post
response:
爬取校花網:
# pip3 install requests import requests import re # 爬蟲三部曲 # 一 發送請求 def get_page(url): print() index_res = requests.get(url) return index_res.text # 二 解析數據 # 解析主頁 def parse_index(index_page): detail_urls = re.findall('<div class="items">.*?href="(.*?)"', index_page, re.S) # print(detail_urls) 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(detail_page): video_urls = re.findall('id="media".*?src="(.*?)"', detail_page, re.S) if video_urls: video_urls = video_urls[0] if video_urls.endswith('.mp4'): yield video_urls # print(video_urls) # 三 保存數據 import uuid def save_video(video_url): try: res = requests.get(video_url) with open(r'D:\tank\day01\movies\%s.mp4' % uuid.uuid4(), 'wb') as f: f.write(res.content) f.flush() except Exception: pass if __name__ == '__main__': base_url = 'http://www.xiaohuar.com/list-3-{}.html' for line in range(5): index_url = base_url.format(line) index_page = get_page(index_url) detail_urls = parse_index(index_page) for detail_url in detail_urls: detail_page = get_page(detail_url) video_urls = parse_detail(detail_page) for video_url in video_urls: save_video(video_url)
import requests import re from concurrent.futures import ThreadPoolExecutor pool = ThreadPoolExecutor(50) # 爬蟲三部曲 # 一 發送請求 def get_page(url): print('%s GET start ...' % url) index_res = requests.get(url) return index_res.text # 二 解析數據 # 解析主頁 def parse_index(index_page): # 拿到主頁的返回結果 res = index_page.result() detail_urls = re.findall('<div class="items">.*?href="(.*?)"', res, re.S) # print(detail_urls) for detail_url in detail_urls: if not detail_url.startswith('http'): detail_url = 'http://www.xiaohuar.com' + detail_url pool.submit(get_page, detail_url).add_done_callback(parse_detail) # yield detail_url # 解析詳情頁 def parse_detail(detail_page): res = detail_page.result() video_urls = re.findall('id="media".*?src="(.*?)"', res, re.S) if video_urls: video_urls = video_urls[0] if video_urls.endswith('.mp4'): pool.submit(save_video, video_urls) # print(video_urls) # 三 保存數據 import uuid def save_video(video_url): try: res = requests.get(video_url) with open(r'D:\tank\day01\movies\%s.mp4' % uuid.uuid4(), 'wb') as f: f.write(res.content) f.flush() print('%s done ...' % video_url) except Exception: pass if __name__ == '__main__': base_url = 'http://www.xiaohuar.com/list-3-{}.html' for line in range(5): index_url = base_url.format(line) pool.submit(get_page, index_url).add_done_callback(parse_index)
查詢出來的頁面要返回content
yeild使用的縮進