多線程爬蟲介紹
- 在之前博客裏(鏈接如下)爬取京東商品圖片時,爬取流程是依次進行的,這種執行流程稱爲單線程結構,單線程結構的爬蟲稱爲單線程爬蟲
- 爬蟲實戰 爬取京東商城圖片
- 多線程爬蟲:爬蟲中某部分程序可以並行執行,即多線程結構的執行流程稱爲多線程爬蟲
多線程介紹
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() #啓動線程
成果展示,因爲之前爬取了一些電腦圖片,所以有幾張電腦圖片在裏面