day01 初見python爬蟲之「爬校花網」和「自動登陸github」

首先咱們來解釋一下幾個概念:html

一、什麼是爬蟲?git

  爬取數據。github

二、什麼是互聯網?web

  由一堆網絡設備、把一臺臺的計算機互聯到一塊兒稱之爲互聯網。正則表達式

三、互聯網創建的目的:數據庫

  數據的傳遞與數據的共享。瀏覽器

四、什麼是數據?cookie

列如:網絡

電商平臺的商品信息(京東、淘寶、亞馬遜)session

租房平臺的房源信息(鏈家、自如)

股票證券的投資信息(東方財富、雪球網)

12306的票務信息(搶票)

五、什麼是上網?

普通用戶:

打開瀏覽器————>輸入網址————>往目標主機發送請求————>返回響應數據————>把數據渲染到瀏覽器中

爬蟲程序:

模擬瀏覽器————>往目標主機發送請求————>返回響應數據————>解析並提取有價值的數據————>保存數據(文件寫入本地,持久化到數據庫中)

六、爬蟲的全過程

  • 1)發送請求(請求庫:Requests/Selenium)
  • 2)獲取響應數據
  • 3)解析數據(解析庫:BeautifulSoup4)
  • 4)保存數據(存儲庫:文件保存、MongoDB)

總結:咱們互聯網的數據比喻成一座寶藏,爬蟲就是在挖取寶藏。


 咱們爬蟲要用到的requests請求庫:

安裝:

pip3 install requests

 每次使用的時候在代碼前面加上

import requests

 

 舉例:

1、爬「校花網」

爲了增長咱們學習的動力,咱們先來爬點視頻。

找到校花網的主頁url:

http://www.xiaohuar.com/list-3-0.html

找到每一個視頻詳情頁的url(經過谷歌瀏覽器檢查的方式(.*?)使用了正則表達式):

<div class="items"><a class="imglink" href="(.*?)"

找到視頻的源地址的url:

<source src="(.*?)">

 

三個函數:

發送請求:

def get_page(url):
    response = requests.get(url)
    return response

解析數據:

import re
def parse_index(html):
    # findall匹配全部
    # re.findall('正則匹配規則','匹配文本'.'匹配模式')
    # re.S:對所有文本進行搜索匹配
    detail_urls = re.findall('<div class="items"><a class="imglink" href="(.*?)"', html, re.S)
    return detail_urls

# 解析詳情頁
def parse_detail(html):
    movie_url = re.findall('<source src="(.*?)">', html, re.S)
    if movie_url:
        return movie_url[0]

保存數據:

import uuid
def save_video(content):
    with open(f'{uuid.uuid4()}.mp4','wb') as f:
        f.write(content)
        print('視頻下載完畢...請客人觀賞!!!')

 

附上全部代碼:

import requests

# 1 發送請求
def get_page(url):
    response = requests.get(url)
    return response

# 2 解析數據
import re
def parse_index(html):
    # findall匹配全部
    # re.findall('正則匹配規則','匹配文本'.'匹配模式')
    # re.S:對所有文本進行搜索匹配
    detail_urls = re.findall('<div class="items"><a class="imglink" href="(.*?)"', html, re.S)
    return detail_urls
# 解析詳情頁
def parse_detail(html):
    movie_url = re.findall('<source src="(.*?)">', html, re.S)
    if movie_url:
        return movie_url[0]

# 3 保存數據
import uuid
def save_video(content):
    with open(f'{uuid.uuid4()}.mp4','wb') as f:
        f.write(content)
        print('視頻下載完畢...請客人觀賞!!!')

# 測試用例
if __name__ == '__main__':
    for line in range(6):
        url = f'http://www.xiaohuar.com/list-3-{line}.html'

        # 發送請求
        response = get_page(url)

        # 解析主頁頁面
        detail_urls = parse_index(response.text)

        # 循環遍歷詳情頁url
        for detail_urls in detail_urls:
            # 往每個詳情頁發送請求
            detail_res = get_page(detail_urls)

            # 解析詳情頁獲取視頻url
            movie_url = parse_detail(detail_res.text)

            # 判斷視頻url存在則打印
            if movie_url:
                print(movie_url)

                # 往視頻url發送請求獲取視頻二進制流
                movie_res = get_page(movie_url)

                # 把視頻的二進制流傳給save_video函數去保存到本地
                save_video(movie_res.content)

 


 

2、自動登陸github

1 訪問登陸界面獲取token隨機字符串
請求url:
https://github.com/login
請求方式:
GET
請求頭:
COOKIES
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
2 解析並提取token字符串
# 正則
<input type="hidden" name="authenticity_token" value="(.*?)"
import requests
import re
login_url = 'https://github.com/login'
login_header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
login_res = requests.get(url=login_url, headers=login_header)


# 解析提取token字符串
authenticity_token = re.findall(
    '<input type="hidden" name="authenticity_token" value="(.*?)"',
    login_res.text,
    re.S
)[0]
print(authenticity_token)

# 獲取login頁面的cookies信息
login_cookies = login_res.cookies.get_dict()
2 開始登陸github
POST請求自動登陸github:
請求方式:
POST
請求URL:
https://github.com/session
請求頭:
Cookie
User-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
請求體:
commit: Sign in
utf8: ✓
authenticity_token: FbwwBOSWi3OrjoT7vmkyVnCruAAMEYkuT4AZcH9U6prQGQh5LLO9j0E8CeCUiP94oyQ/RwReQ81fDwfxWUa+sw==
login: ********
password: *******
webauthn-support: supported
# 請求url
session_url = 'https://github.com/session'
# 請求頭信息
session_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
# 請求體信息
form_data = {
    "commit": "Sign in",
    "utf8": "",
    "authenticity_token": authenticity_token,
    "login": "*******",
    "password": "********",
    "webauthn-support": "supported"
}

session_res = requests.post(
    url=session_url,
    headers=session_headers,
    cookies=login_cookies,
    data=form_data
)

with open('github.html', 'w', encoding='utf-8') as f:
    f.write(session_res.text)

其中******改爲本身的github帳號和密碼,請求頭信息和請求體信息經過瀏覽器的檢查方式查看。

 

附上全部代碼:

import requests
import re
login_url = 'https://github.com/login'
login_header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
login_res = requests.get(url=login_url, headers=login_header)


# 解析提取token字符串
authenticity_token = re.findall(
    '<input type="hidden" name="authenticity_token" value="(.*?)"',
    login_res.text,
    re.S
)[0]
print(authenticity_token)

# 獲取login頁面的cookies信息
login_cookies = login_res.cookies.get_dict()

# 請求url
session_url = 'https://github.com/session'

# 請求頭信息
session_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
# 請求體信息
form_data = {
    "commit": "Sign in",
    "utf8": "",
    "authenticity_token": authenticity_token,
    "login": "*******",
    "password": "*******",
    "webauthn-support": "supported"
}

session_res = requests.post(
    url=session_url,
    headers=session_headers,
    cookies=login_cookies,
    data=form_data
)

with open('github.html', 'w', encoding='utf-8') as f:
    f.write(session_res.text)
相關文章
相關標籤/搜索