爬蟲

爬蟲

爬蟲的應用:

# 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使用的縮進

 

posted @ 2019-03-07 15:07 ChuckXue 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章