小さな爬虫類が子猫の写真をクロールし、ローカルフォルダーに保存する

小さな爬虫類が子猫の写真をクロールし、ローカルフォルダーに保存する

私は安徽理工大学電気情報工学部の大学院生です。私は最近学校を始めないのは本当にひどいです。私は愚かなので、機械学習とコンピュータービジョンを学ぶために遅くから始めなければなりませんが、いつもこれを学びますそれは退屈で無意味な感じです。家で退屈なので、画像処理を使用するために、子猫の写真をローカルファイルにクロールしました。また、とってもキュート!さて、実際の演習を始めましょう!

1.いくつかのライブラリが
必要5つのライブラリがここに必要です。もちろん、より単純にしたい場合は、いくつかを削除することもできます。
geventパッケージ:これは、複数のコルーチンを使用するために不可欠なパッケージです。複数のコルーチンを使用して
ない場合、この時間パッケージは使用できません。これは、タイミングとクロール間隔の設定に使用できます。それ以外の場合、サーバーに適していません。それは良くない。
リクエストパッケージ:これは、URLリンクを処理して応答するために必要です。
BeautifuiSoupパッケージ:これは応答URLを解析するためのものです。
osパッケージ:フォルダーを作成します。

from gevent import monkey
monkey.patch_all()
from gevent.queue import Queue
import requests
from bs4 import BeautifulSoup
import gevent
import time
import os

2.必要なライブラリをインポートした後、クロールするために、WebページのURLを分析して、応答画像が非表示になっている場所を確認する必要があります。ここで使用したURLは、
キティのWebサイトです。
開くと、たくさんのかわいい子猫が見つかり、人々は去るのをためらいます(笑)さて、Webページを開いて、子猫であることを確認しますURLリンクはimg srcで非表示になっています。
ここで使用したのは、最小の父親と一緒に見つけることです。私が見つけた最小の父親は

'div',class_='il_img'

さらに苦労せずに、私がクロールしたすべてのコードを以下に示します。これは基本的に非常にシンプルで、一目でわかります。

def pachong():
    while not work.empty():
        url = work.get_nowait()
        res = requests.get(url,headers = headers)
        jiexi = BeautifulSoup(res.text,'html.parser')
        fuxi = jiexi.find_all('div',class_='il_img')
        for i in fuxi:
            photo = i.find_all('a')[0].find('img')['src']
            transform = str(photo)
            add = 'https:' + transform
            image.append(add)

3.次の手順では、画像をローカルファイルに保存します。最初にosモジュールを使用してフォルダーを作成します。作成後は、画像であり、WBモードでフォルダーに書き込まれます。

dir_name = 'catimage'
            #在当前目录下创建文件夹
            if not os.path.exists(dir_name):
                os.mkdir(dir_name)

            i = 0
            for img in image:
                #给它一点点时间,不然可能会把服务器搞崩掉。。
                time.sleep(0.1)
                picture_name = img.split('/')[-1] #提取图片url后缀,一定要用!
                response = requests.get(img,headers = headers)
                
                with open(dir_name+'/'+picture_name,'wb') as f:
                    f.write(response.content)
                 

4.さらに、非同期クロール用の5つのクローラーも追加しました。
ここに画像の説明を挿入
5.わかりました、たくさん言った後、私たちが最終的に何が得られたかを確認する番です。ローカルフォルダーに移動して、作成したcatimageフォルダーを見つけました。開いて見ることができます(私のスクリーンショットは画像の一部です)、とてもかわいいです!
ここに画像の説明を挿入
6.全体のソースコードは次のとおりです。

#需要导入的库
#我采用多协程方式
from gevent import monkey
monkey.patch_all()
from gevent.queue import Queue
import requests
from bs4 import BeautifulSoup
import gevent
import time
import os


#用time.time()方法来记录爬取的时间
starttime = time.time()
work = Queue()
start_url = 'https://www.ivsky.com/tupian/xiaomao_t3023/index_{page}.html'
#头文件还是要加的,不然会被服务器拦截掉,导致爬取不到
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}

#对服务器不能太狠,所以只爬取4页就好了。。。
for x in range(1,5):
    real_url = start_url.format(page = x)
    work.put_nowait(real_url)


image = []

#主要爬虫的操作都在这里
def pachong():
    while not work.empty():
        url = work.get_nowait()
        res = requests.get(url,headers = headers)
        jiexi = BeautifulSoup(res.text,'html.parser')
        fuxi = jiexi.find_all('div',class_='il_img')
        for i in fuxi:
            photo = i.find_all('a')[0].find('img')['src']
            transform = str(photo)
            add = 'https:' + transform
            image.append(add)
            
            dir_name = 'catimage'
            #在当前目录下创建文件夹
            if not os.path.exists(dir_name):
                os.mkdir(dir_name)

            i = 0
            for img in image:
                #给它一点点时间,不然可能会把服务器搞崩掉。。
                time.sleep(0.1)
                picture_name = img.split('/')[-1] #提取图片url后缀,一定要用!
                response = requests.get(img,headers = headers)
                
                with open(dir_name+'/'+picture_name,'wb') as f:
                    f.write(response.content)
                i = i+1
                print('正在爬取第'+str(i)+'张图片')
            
                
     
           
            
task_list = []
for z in range(5):
    task = gevent.spawn(pachong)
    task_list.append(task)
gevent.joinall(task_list)
endtime = time.time()
print('爬取时长:',endtime-starttime)

よし。わからない場合はコメントしてね!

元の記事を2件公開 賞賛3件 訪問89件

おすすめ

転載: blog.csdn.net/Jshauishaui/article/details/105576502