最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python基礎(chǔ)之爬蟲入門

 更新時(shí)間:2021年05月10日 16:18:00   作者:佩瑞  
這篇文章主要介紹了python基礎(chǔ)之爬蟲入門,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲的小伙伴們有很好地幫助喲,需要的朋友可以參考下

前言

python基礎(chǔ)爬蟲主要針對(duì)一些反爬機(jī)制較為簡單的網(wǎng)站,是對(duì)爬蟲整個(gè)過程的了解與爬蟲策略的熟練過程。
爬蟲分為四個(gè)步驟:請(qǐng)求,解析數(shù)據(jù),提取數(shù)據(jù),存儲(chǔ)數(shù)據(jù)。本文也會(huì)從這四個(gè)角度介紹基礎(chǔ)爬蟲的案例。

一、簡單靜態(tài)網(wǎng)頁的爬取

我們要爬取的是一個(gè)壁紙網(wǎng)站的所有壁紙

http://www.netbian.com/dongman/

在這里插入圖片描述

1.1 選取爬蟲策略——縮略圖

首先打開開發(fā)者模式,觀察網(wǎng)頁結(jié)構(gòu),找到每一張圖對(duì)應(yīng)的的圖片標(biāo)簽,可以發(fā)現(xiàn)我們只要獲取到標(biāo)黃的img標(biāo)簽并向它發(fā)送請(qǐng)求就可以得到壁紙的預(yù)覽圖了。

在這里插入圖片描述

隨后注意到網(wǎng)站不止一頁,打開前3頁的網(wǎng)站觀察url有沒有規(guī)律

http://www.netbian.com/dongman/index.htm#第一頁
http://www.netbian.com/dongman/index_2.htm#第二頁
http://www.netbian.com/dongman/index_3.htm#第三頁

我們發(fā)現(xiàn)除了第一頁其他頁數(shù)的url都是有著固定規(guī)律的,所以先構(gòu)建一個(gè)含有所有頁數(shù)url的列表

url_start = 'http://www.netbian.com/dongman/'
url_list=['http://www.netbian.com/dongman/index.htm']
if not os.path.exists('./exercise'):
    os.mkdir('./exercise')
for i in range(2,133):
    url = url_start+'index_'+str(i)+'.htm'
    url_list.append(url)

至此我們的基本爬蟲策略就確定了。

網(wǎng)頁請(qǐng)求

for url in url_list:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
    response = requests.get(url=url,headers=headers).text

解析數(shù)據(jù)

在這里我們選用etree解析數(shù)據(jù)

tree = etree.HTML(response)

提取數(shù)據(jù)

在這里我們選用xpath提取數(shù)據(jù)

leaf = tree.xpath('//div[@class="list"]//ul/li/a/img/@src')
for l in leaf:
      print(l)
      h = requests.get(url=l, headers=headers).content

存儲(chǔ)數(shù)據(jù)

i = 'exercise/' + l.split('/')[-1]
with open(i, 'wb') as fp:
      fp.write(h)

完整代碼

import requests
from lxml import etree
import os
url_start = 'http://www.netbian.com/dongman/'
url_list=['http://www.netbian.com/dongman/index.htm']
#http://www.netbian.com/dongman/index_2.htm
if not os.path.exists('./exercise'):
    os.mkdir('./exercise')
for i in range(2,133):
    url = url_start+'index_'+str(i)+'.htm'
    url_list.append(url)
print(url_list)
for url in url_list:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
    response = requests.get(url=url,headers=headers).text
    tree = etree.HTML(response)
    leaf = tree.xpath('//div[@class="list"]//ul/li/a/img/@src')
    for l in leaf:
        print(l)
        h = requests.get(url=l, headers=headers).content
        i = 'exercise/' + l.split('/')[-1]
        with open(i, 'wb') as fp:
            fp.write(h)

1.2 選取爬蟲策略——高清大圖

在剛剛的爬蟲中我們爬取到的只是壁紙的縮略圖,要想爬到高清版本,就需要我們更改策略。重新打開開發(fā)者工具進(jìn)行觀察,發(fā)現(xiàn)在原先爬取的img標(biāo)簽之上還有一個(gè)href標(biāo)簽,打開之后就會(huì)跳轉(zhuǎn)高清大圖。

在這里插入圖片描述
在這里插入圖片描述

那么此時(shí)我們的爬取策略就變成了提取這個(gè)href標(biāo)簽的內(nèi)容,向這個(gè)標(biāo)簽中的網(wǎng)站發(fā)送請(qǐng)求,隨后在該網(wǎng)站中找到img標(biāo)簽進(jìn)行再一次請(qǐng)求。

我們用到了正則表達(dá)式來提取href標(biāo)簽的內(nèi)容。正則表達(dá)式是比xpath語法更簡便的一種數(shù)據(jù)提取方法,具體有關(guān)語法可查看以下文檔

for url in url_list:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
    response = requests.get(url=url,headers=headers).text
    leaf = re.findall("desk/\d*.htm",response,re.S)
    for l in leaf:
        url = "http://www.netbian.com/"+str(l)
        h = requests.get(url=url, headers=headers).text
        leaf_ =re.findall('<div class="pic">.*?(http://img.netbian.com/file/\d*/\d*/\w*.jpg)',h,re.S)

這樣輸出的leaf_就是我們要找的高清大圖的img標(biāo)簽,此時(shí)我們只需要再次發(fā)送請(qǐng)求隨后再保存數(shù)據(jù)就可以了。

存儲(chǔ)數(shù)據(jù)

for l_ in leaf_:
      print(l_)
      h = requests.get(url=l_, headers=headers).content
      i = 'exercise/' + l_.split('/')[-1]
      with open(i, 'wb') as fp:
          fp.write(h)

完整代碼

import requests
import os
import re
url_start = 'http://www.netbian.com/dongman/'
url_list=['http://www.netbian.com/dongman/index.htm']
if not os.path.exists('./exercise'):
    os.mkdir('./exercise')
for i in range(2,133):
    url = url_start+'index_'+str(i)+'.htm'
    url_list.append(url)
print(url_list)
for url in url_list:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
    response = requests.get(url=url,headers=headers).text
    leaf = re.findall("desk/\d*.htm",response,re.S)
    for l in leaf:
        url = "http://www.netbian.com/"+str(l)
        h = requests.get(url=url, headers=headers).text
        leaf_ =re.findall('<div class="pic">.*?(http://img.netbian.com/file/\d*/\d*/\w*.jpg)',h,re.S)
        for l_ in leaf_:
            print(l_)
            h = requests.get(url=l_, headers=headers).content
            i = 'exercise/' + l_.split('/')[-1]
            with open(i, 'wb') as fp:
                fp.write(h)

    

二、動(dòng)態(tài)加載網(wǎng)站的爬取

我們要爬取的是另一個(gè)壁紙網(wǎng)站的所有壁紙

https://sucai.gaoding.com/topic/9080?

在這里插入圖片描述

2.1 選取爬蟲策略——selenium

首先打開開發(fā)者模式,觀察網(wǎng)頁結(jié)構(gòu),此時(shí)我們會(huì)發(fā)現(xiàn)一頁上的所有壁紙并不是全部都加載出來了的,也就是說隨著我們下拉滾動(dòng)條,內(nèi)容會(huì)不斷實(shí)時(shí)加載出來,查看網(wǎng)頁元素時(shí)也能看到lazy-image這個(gè)代表動(dòng)態(tài)加載的標(biāo)簽。

在這里插入圖片描述

由于是動(dòng)態(tài)加載,因此不能用之前的直接發(fā)送請(qǐng)求的辦法來爬取數(shù)據(jù)了,面對(duì)這種情況我們就需要模擬瀏覽器發(fā)送一個(gè)請(qǐng)求,并且下拉頁面,來實(shí)現(xiàn)爬取一個(gè)實(shí)時(shí)加載網(wǎng)頁的目的。

觀察完網(wǎng)頁結(jié)構(gòu)之后我們又來觀察頁數(shù),這次就不多說了,想必大家也能發(fā)現(xiàn)規(guī)律

url_list=[]
for i in range(1,4):
    url =  'https://sucai.gaoding.com/topic/9080?p={}'.format(i)
    url_list.append(url)

網(wǎng)頁請(qǐng)求

在這里我們用到了selenium這個(gè)自動(dòng)化測試框架

for url in url_list:
    driver = webdriver.Chrome()
    driver.get(url)
    driver.maximize_window()
    time.sleep(2)
    i=0
    while i<10:#下拉滾動(dòng)條加載頁面
        i+=1
        driver.execute_script("window.scrollBy(0,500)")
        driver.implicitly_wait(5)#顯式等待

解析提取數(shù)據(jù)

items = driver.find_elements_by_xpath("http://*[@class='gdd-lazy-image__img gdd-lazy-image__img--loaded']")
    for item in items:
            href = item.get_attribute('src')
            print(href)

至于數(shù)據(jù)的存儲(chǔ)只需要再請(qǐng)求我們爬下來的href標(biāo)簽的網(wǎng)站就可以了。

完整代碼

from selenium import webdriver
import time
import os
if not os.path.exists('./exercise'):
    os.mkdir('./exercise')
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36'
    }
url_list=[]
url_f_list=[]
for i in range(1,4):
    url =  'https://sucai.gaoding.com/topic/9080?p={}'.format(i)
    url_list.append(url)
for url in url_list:
    driver = webdriver.Chrome()
    driver.get(url)
    driver.maximize_window()
    time.sleep(2)
    i=0
    while i<10:
        i+=1
        driver.execute_script("window.scrollBy(0,500)")
        driver.implicitly_wait(5)#顯式等待
    items = driver.find_elements_by_xpath("http://*[@class='gdd-lazy-image__img gdd-lazy-image__img--loaded']")
    for item in items:
            href = item.get_attribute('src')
            print(href)

2.2 選取爬蟲策略——api

眾所周知,api接口是個(gè)好東西,如果找到了它,我們就無需擔(dān)心動(dòng)態(tài)加載,請(qǐng)求api返回給我們的是json格式的字典,里面或許有我們需要的東西也說不定。那么我們重新打開開發(fā)者工具搜索一番吧!

在這里插入圖片描述

從Element切換到Network我們可以發(fā)現(xiàn)這里多了好多奇怪的東西,但是打開preview好像沒有我們能用到的。

這個(gè)時(shí)候別灰心,切換下頁面,等第二頁加載出來的時(shí)候最后又多出來了一個(gè)xhr文件,點(diǎn)開preview我們驚喜的發(fā)現(xiàn),這個(gè)里面有每一張圖id的信息!

在這里插入圖片描述

搜尋一圈發(fā)現(xiàn)字典里有效的只有id這個(gè)值,那么id對(duì)于我們的圖片爬取有什么意義呢?通常情況下網(wǎng)址+id就可以定位到具體的圖片,于是我點(diǎn)進(jìn)去一張壁紙,驚喜的發(fā)現(xiàn)跟我想的一樣!

在這里插入圖片描述

最后又到了我們老生常談的頁數(shù)環(huán)節(jié),在看到這個(gè)api的request url之后大家有沒有觀察到它其中帶著page_num=2&page_size=100這兩個(gè)看著很像頁碼的參數(shù)呢?我們?cè)偻戮涂吹搅藚?shù)中也正好有這兩個(gè)值!也就是說我們只需要更改page_num=2就可以實(shí)現(xiàn)翻頁了!

在這里插入圖片描述

url='https://api-sucai.gaoding.com/api/csc-api/topics/9080/modules/18928/templets?'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
params_list=[]
for i in range(1,4):
    parms ={
        'page_num': i,
        'page_size': 100
    }
    params_list.append(parms)

解析提取數(shù)據(jù)

for param in params_list:
    response = requests.get(url=url,params=param,headers=headers).json()
    for i in range(100):
        try:
            dict  =response[i]
            id = dict['id']
            url_f = 'https://sucai.gaoding.com/material/'+str(id)
            url_f_list.append(url_f)
        except:
            pass

存儲(chǔ)數(shù)據(jù)

for l in url_f_list:
    print(l)
    h = requests.get(url=l, headers=headers).content
    i = 'exercise/' + l.split('/')[-1]
    with open(i, 'wb') as fp:
        fp.write(h)

完整代碼

import os
import requests
if not os.path.exists('./exercise'):
    os.mkdir('./exercise')
url='https://api-sucai.gaoding.com/api/csc-api/topics/9080/modules/18928/templets?'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
params_list=[]
url_f_list=[]
for i in range(1,4):
    parms ={
        'page_num': i,
        'page_size': 100
    }
    params_list.append(parms)
for param in params_list:
    response = requests.get(url=url,params=param,headers=headers).json()
    for i in range(100):
        try:
            dict  =response[i]
            id = dict['id']
            url_f = 'https://sucai.gaoding.com/material/'+str(id)
            url_f_list.append(url_f)
        except:
            pass
for l in url_f_list:
    print(l)
    #h = requests.get(url=l, headers=headers).content
    #i = 'exercise/' + l.split('/')[-1]
    #with open(i, 'wb') as fp:
    #    fp.write(h)

三、selenium模擬登錄

我們要爬取的網(wǎng)站總是免不了登錄這一關(guān)鍵環(huán)節(jié),因此模擬登錄也是一大爬蟲基礎(chǔ)。
我們要模擬登錄的網(wǎng)站如下

https://www.icourse163.org/course/BIT-268001

在這里插入圖片描述

選取爬蟲策略

既然我們是用selenium模擬登陸,首先肯定要明確我們要模擬的具體內(nèi)容,歸納起來就是

點(diǎn)擊 登錄|注冊(cè)
點(diǎn)擊 其他登陸方式
點(diǎn)擊 手機(jī)號(hào)登錄
輸入賬號(hào)
輸入密碼
點(diǎn)擊 登錄

在明確該干些什么之后我們就打開開發(fā)者模式觀察一下這個(gè)登錄框吧。

在這里插入圖片描述

不看不知道,一看嚇一跳,原來這里有一個(gè)iframe框架,這就意味著如果我們不做任何處理就查找元素的話可能會(huì)什么都查找不到。這就相當(dāng)于在王家找李家的東西一樣,我們首先需要切換到當(dāng)前iframe

driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="j-ursContainer-1"]/iframe'))

經(jīng)過這一操作之后我們就可以正常按部就班的進(jìn)行模擬登陸了!

完整代碼

from selenium import webdriver
import time
url = 'https://www.icourse163.org/course/BIT-268001'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
#time.sleep(2)
driver.find_element_by_xpath('//div[@class="unlogin"]/a').click()
driver.find_element_by_class_name('ux-login-set-scan-code_ft_back').click()
driver.find_element_by_xpath('//ul[@class="ux-tabs-underline_hd"]/li[2]').click()
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="j-ursContainer-1"]/iframe'))
driver.implicitly_wait(2)#給登錄框一些加載的時(shí)間
driver.find_element_by_css_selector('input[type="tel"]').send_keys('15201359153')
driver.find_element_by_css_selector('input[class="j-inputtext dlemail"]').send_keys('Asdasd123')
driver.implicitly_wait(2)#如果不等待的話可能密碼還沒輸入結(jié)束就點(diǎn)按登錄鍵了
driver.find_element_by_id('submitBtn').click()

到此這篇關(guān)于python基礎(chǔ)之爬蟲入門的文章就介紹到這了,更多相關(guān)python入門爬蟲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決django model修改添加字段報(bào)錯(cuò)的問題

    解決django model修改添加字段報(bào)錯(cuò)的問題

    今天小編就為大家分享一篇解決django model修改添加字段報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 解決python錯(cuò)誤提示:TypeError: expected string or bytes-lik問題

    解決python錯(cuò)誤提示:TypeError: expected string or&nb

    這篇文章主要介紹了解決python錯(cuò)誤提示:TypeError: expected string or bytes-lik問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 淺談python的深淺拷貝以及fromkeys的用法

    淺談python的深淺拷貝以及fromkeys的用法

    這篇文章主要介紹了python的深淺拷貝以及fromkeys的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Python代碼調(diào)試的方法集錦

    Python代碼調(diào)試的方法集錦

    程序能一次寫完并正常運(yùn)行的概率很小,基本不超過1%,總會(huì)有各種各樣的bug需要修正,有的bug很簡單,看看錯(cuò)誤信息就知道,有的bug很復(fù)雜,因此,需要一整套調(diào)試程序的手段來修復(fù)bug,所以本文給大家介紹了Python代碼調(diào)試的方法集錦,需要的朋友可以參考下
    2025-03-03
  • 詳解centos7+django+python3+mysql+阿里云部署項(xiàng)目全流程

    詳解centos7+django+python3+mysql+阿里云部署項(xiàng)目全流程

    這篇文章主要介紹了詳解centos7+django+python3+mysql+阿里云部署項(xiàng)目全流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python實(shí)現(xiàn)圖片變亮或者變暗的方法

    python實(shí)現(xiàn)圖片變亮或者變暗的方法

    這篇文章主要介紹了python實(shí)現(xiàn)圖片變亮或者變暗的方法,涉及Python中Image模塊操作圖片的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • python監(jiān)控進(jìn)程腳本

    python監(jiān)控進(jìn)程腳本

    這篇文章主要為大家詳細(xì)介紹了python監(jiān)控進(jìn)程腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python?PyCharm無法打開終端命令行最終解決方案(實(shí)測成功)

    Python?PyCharm無法打開終端命令行最終解決方案(實(shí)測成功)

    這篇文章主要介紹了在使用PyCharm?2024版本時(shí)遇到的無法打開終端的問題,文中提供了兩種解決方案,大家可以根據(jù)自己的需求選擇對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2024-12-12
  • Python挑選文件夾里寬大于300圖片的方法

    Python挑選文件夾里寬大于300圖片的方法

    這篇文章主要介紹了Python挑選文件夾里寬大于300圖片的方法,實(shí)例分析了Python中PIL庫的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 使用Pytorch+PyG實(shí)現(xiàn)MLP的詳細(xì)過程

    使用Pytorch+PyG實(shí)現(xiàn)MLP的詳細(xì)過程

    圖神經(jīng)網(wǎng)絡(luò)是最近 AI 領(lǐng)域最熱門的方向之一,下面這篇文章主要給大家介紹了關(guān)于使用Pytorch+PyG實(shí)現(xiàn)MLP的詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03

最新評(píng)論

贵溪市| 平泉县| 海安县| 彭山县| 西充县| 庆元县| 中阳县| 萨嘎县| 大方县| 博兴县| 巴彦淖尔市| 商河县| 孟连| 南部县| 永川市| 武强县| 始兴县| 贵德县| 大余县| 开封县| 简阳市| 罗平县| 高台县| 柳河县| 香河县| 临汾市| 三江| 镇赉县| 赤峰市| 玛曲县| 建昌县| 台湾省| 蓬溪县| 山东| 廉江市| 沁源县| 屏东县| 宁津县| 建德市| 宜章县| 明光市|