python爬蟲工程師 成長之路五(二) 多線程爬蟲


多線程爬蟲介紹


  • 在之前博客裏(鏈接如下)爬取京東商品圖片時,爬取流程是依次進行的,這種執行流程稱爲單線程結構,單線程結構的爬蟲稱爲單線程爬蟲
  • 爬蟲實戰 爬取京東商城圖片
  • 多線程爬蟲:爬蟲中某部分程序可以並行執行,即多線程結構的執行流程稱爲多線程爬蟲

多線程介紹


python中可以通過導入threading模塊來使用多線程
import threading
定義類並繼承threading.Thread類,則該類就是一個線程
#定義線程A
class Thread_A(threading.Thread):

    def _init_(self):#初始化線程
        threading.Thread._init_(self)
        
    def run(self):#線程A需要做的事
        pass
使用線程
a1=Thread_A () #實例化線程A
a1.start() #啓動線程

不懂_init_()可以去看我之前的博客 python 繼承、多態、特殊方法講解


多線程爬蟲實戰


如果需要爬取京東商城40頁手機圖片,我們可以用四個線程分別來爬取8頁,這就是常用的多線程.

這裏我就只開兩個線程進行爬取16頁京東手機圖片
import urllib.request
import re
import threading
import http.client

def reptile(url,page):
    req=urllib.request.Request(url) #創建Request對象
    req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
    data=urllib.request.urlopen(req).read()#打開網址
    data=str(data)
    # pattern1='<a target="_blank" href=".+?">'
    pattern1='<img width="220" height="220" data-img="1" data-lazy-img=".+?">'
    result=re.compile(pattern1).findall(data)

    result=str(result)
    pattern2='<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)">'
    result1=re.compile(pattern2).findall(result)
    # print(result1)
    x=1
    print(result1)
    for imageurl in result1:
        imagename="D:/picture/"+str(page)+str(x)+".jpg"
        imageurl="http://"+imageurl
        x+=1
        
        try:
              urllib.request.urlretrieve(imageurl,filename=imagename)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                x+=1
            if hasattr(e,"reason"):
                x+=1
        except http.client.InvalidURL as f: #url異常
            x+=1
#線程A
class Thread_A(threading.Thread):
    def _init_(self):#初始化線程
        threading.Thread._init_(self)
        
    def run(self):#線程A需要做的事
        for i in range(1,8):
            url="http://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
            reptile(url,i)
#線程B
class Thread_B(threading.Thread):
    def _init_(self):#初始化線程
        threading.Thread._init_(self)
        
    def run(self):#線程A需要做的事
        for i in range(9,16):
            url="http://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
            reptile(url,i)

a1=Thread_A() #實例化線程A
a1.start() #啓動線程            
b1=Thread_B() #實例化線程B
b1.start() #啓動線程
成果展示,因爲之前爬取了一些電腦圖片,所以有幾張電腦圖片在裏面

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章