03Request爬取豆瓣電影信息及selenium請求庫

昨日回顧

1、爬蟲基本原理

-爬蟲全過程css

1.發送請求html

2.接受相應數據java

3.解析並提取有價值的消息python

4.保存數據git

2、Requests請求庫

-getgithub

​ urlweb

​ headers正則表達式

​ cookieschrome

-post瀏覽器

​ url

​ headers

​ cookies

​ data

3、爬取校花網

1.經過主頁解析提取詳情頁

2.經過詳情頁提取視頻url

3.獲取視頻的二進制流寫入本地

4、自動登錄GitHub

1.分析請求體信息

-用戶名

-密碼

-token

-雜七雜八

2.token

經過對login頁面的解析提取

3.對session頁面發送請求

-headers:

​ -User-Agent

-cookies

​ -login頁面的cookie

-data

​ -form data

今日內容:

1、Request爬取豆瓣電影信息

-url:https://movie.douban.com/top250

-請求方式:get

-請求頭:

user-agent

cookies

爬取的信息:

電影名稱、電影url、電影導演、電影主演、電影年份、

電影類型、電影評分、電影評價、電影簡介

分析全部主頁的url

第一頁:

<https://movie.douban.com/top250?start=0&filter=>

第二頁:

https://movie.douban.com/top250?start=25&filter=

...

能夠看出規律

用代碼寫出不一樣頁數的url

num = 0
for line in range(10):
    url = f'https://movie.douban.com/top250?start={num}&filter='
    num += 25

get_page函數發送請求

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

先找出豆瓣有關信息的dom

<div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img width="100" alt="肖申克的救贖" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救贖</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飛(港)  /  刺激1995(臺)</span>
                        <span class="playable">[可播放]</span>
                </div>
                <div class="bd">
                    <p class="">
                        導演: 弗蘭克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·羅賓斯 Tim Robbins /...<br>
                        1994&nbsp;/&nbsp;美國&nbsp;/&nbsp;犯罪 劇情
                    </p>
                             <div class="star">
                            <span class="rating5-t"></span>
                            <span class="rating_num" property="v:average">9.6</span>
                            <span property="v:best" content="10.0"></span>
                            <span>1468896人評價</span>
                    </div>

                        <p class="quote">
                            <span class="inq">但願讓人自由。</span>
                        </p>
                </div>
            </div>
        </div>

用正則表達式匹配

<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?導演: (.*?)主演: (.*?)<br>(.*?)</p>.*?<span class="rating_num" .*?>(.*?)</span>.*?<span>(.*?)人評價</span>.*?<span class="inq">(.*?)</span>

pare_index函數解析頁面

def pare_index(html):
    # 正則表達式

    movie_list = re.findall('<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?導演: (.*?)主演: (.*?)<br>(.*?)</p>.*?<span class="rating_num" .*?>(.*?)</span>.*?<span>(.*?)人評價</span>.*?<span class="inq">(.*?)</span>',
                            html,
                            re.S)
    return movie_list

save_data函數保存數據

# 三、保存數據
def save_data(movie):
    # 電影排名、電影url、電影名稱、電影導演、電影主演
    # 電影年份 / 電影類型、電影評分、電影評論、電影簡介
    top, m_url, name, daoyan, actor, year_type, \
    point, commit, desc = movie
    year_type = year_type.strip('\n')
    data = f'''
                ======== 歡迎尊敬官人觀賞 ========
                        電影排名:{top}
                        電影url:{m_url}
                        電影名稱:{name}
                        電影導演:{daoyan}
                        電影主演:{actor}
                        年份類型:{year_type}
                        電影評分:{point}
                        電影評論:{commit}
                        電影簡介:{desc}
                ======== 請官人下次再來喲 ========
                \n
                \n
                '''
    print(data)

    with open('douban_top250.txt', 'a', encoding='utf-8') as f:
        f.write(data)

    print(f'電影: {name} 寫入成功...')

2、selenium請求庫

一、selenium是什麼?

  selenium最初是一個自動化測試工具,而爬蟲中使用它主要是爲了解決requests沒法執行javaScript代碼的問題。原理是驅動瀏覽器執行一些必定好的操做。爬蟲本質上就是模擬瀏覽器,因此能夠用它來作爬蟲

2.爲何要使用selenium

優勢:

-執行js代碼

-不須要分析複雜的通訊流程

-對瀏覽器作彈窗、下拉操做

-******獲取動態數據

-*****破解登錄驗證

缺點:

-執行效率低

3.安裝與使用

3.1安裝selenium請求庫

pip3 install selenium

3.2必須安裝chrome瀏覽器

3.3安裝瀏覽器驅動

3.4示例:搜索京東商品

from selenium import webdriver
from selenium.webdriver.common.by import By #按照什麼方式查找,By.Id,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操做
from selenium.webdriver.support import expected_conditions as EC #和下面WebDriverWait一塊兒用的
from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素

import time
#方式一:經過驅動打開瀏覽器
driver = webdriver.Chrome(r'C:\Program Files (x86)\chromedriver.exe')

# 方式二:把webdriver.exe驅動放到python解釋器安裝目錄/Scripts文件夾中
#python解釋器安裝目錄/Scripts配置環境變量
#python解釋器安裝目錄 配置環境變量
try:
    driver.get("https://www.jd.com/")

    # 獲取顯式等待對象10秒
    # 能夠等待某個標籤加載10秒
    wait = WebDriverWait(driver,10)
    # 查找元素id爲key
    input_tag = wait.until(EC.presence_of_element_located(
        (By.ID, 'key')
    ))
    time.sleep(5)
    #在輸入框輸入商品名稱

    input_tag.send_keys('蘋果')

    #按下回車

    input_tag.send_keys(Keys.ENTER)

    time.sleep(20)
finally:
    # 關閉瀏覽器
    driver.close()

3.5示例二:自動登入百度

''''''
from selenium import webdriver  # web驅動
from selenium.webdriver.common.keys import Keys  # 鍵盤按鍵操做
import time

driver = webdriver.Chrome()

try:

    # 隱式等待: 須要在get以前調用
    # 等待任意元素加載10秒
    driver.implicitly_wait(10)

    driver.get('https://www.baidu.com/')

    # 顯式等待: 須要在get以後調用
    time.sleep(5)

    '''
    ===============全部方法===================
        element是查找一個標籤
        elements是查找全部標籤
    '''
    # 自動登陸百度 start
    # 一、find_element_by_link_text # 經過連接文本去找
    login_link = driver.find_element_by_link_text('登陸')
    login_link.click()  # 點擊登陸

    time.sleep(1)

    # 二、find_element_by_id # 經過id去找
    user_login = driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn')
    user_login.click()

    time.sleep(1)

    # 三、find_element_by_class_name
    user = driver.find_element_by_class_name('pass-text-input-userName')
    user.send_keys('*****')

    # 四、find_element_by_name
    pwd = driver.find_element_by_name('password')
    pwd.send_keys('*****')

    submit = driver.find_element_by_id('TANGRAM__PSP_10__submit')
    submit.click()
    # end

    # 五、find_element_by_partial_link_text
    # 局部連接文本查找
    login_link = driver.find_element_by_partial_link_text('登')
    login_link.click()

    # 六、find_element_by_css_selector
    # 根據屬性選擇器查找元素
    # .: class
    # #: id
    login2_link = driver.find_element_by_css_selector('.tang-pass-footerBarULogin')
    login2_link.click()

    # 七、find_element_by_tag_name
    div = driver.find_elements_by_tag_name('div')
    print(div)


    time.sleep(20)

finally:
    # 關閉瀏覽器釋放操做系統資源
    driver.close()
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息