今天寫一下關於多線程的爬蟲,此次咱們爬取的是鬥圖網站的表情包。html
一. 思路:python
1.對網站翻頁連接進行分析,發現連接爲:「http://www.doutula.com/article/list/?page=3」,咱們只須要對數字「3」進行更改即可以到達想訪問的網頁界面。多線程
2.建立一個文件夾,用來存儲表情包文件夾。app
3.經過分析得到每一個表情包的連接,並將其封裝到一個函數中,函數最終返回一個含有單個網頁全部表情包連接的列表。dom
4.對單個表情包連接進行訪問,得到每一個圖片的連接,並將圖片下載,保存到名爲網頁title的文件夾中,將這段代碼封裝到一個函數中。函數
5.建立一個函數,將3和4建立的函數進行封裝。網站
6.建立一個繼承threading.Thread的子類。url
7.建立線程列表,建立線程,激活線程。spa
二. 代碼:線程
1 #!/ur/bin/nv python3 2 #*- coding: utf-8 -*- 3 4 #導入模塊 5 import requests 6 import os 7 import threading 8 from bs4 import BeautifulSoup 9 import time 10 11 #建立函數,用來對單頁網頁進行獲取連接,返回一個包含全部連接的列表。 12 #繼承線程類 13 class New_thread(threading.Thread): 14 def __init__(self,han_name,han_can): 15 super().__init__() 16 self.han_name = han_name 17 self.han_can = han_can 18 def run(self): 19 self.han_name(*self.han_can) 20 #獲取單頁的全部鬥圖包連接 21 def dan_url_list(url,num): 22 headers = {'user-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'} 23 url_2 = url + str(num) 24 html = requests.get(url_2,headers=headers,timeout=30) 25 html.encoding = html.apparent_encoding 26 soup = BeautifulSoup(html.text,'html.parser') 27 url_lists = [] 28 a= soup.find_all(name='a',attrs={'class':'list-group-item random_list'}) 29 for x in a: 30 url_lists.append(x['href']) 31 return url_lists 32 33 #得到單頁連接後,對單個鬥圖包的url進行獲取每張圖片的連接。 34 def img_url(url): 35 headers = { 36 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'} 37 html = requests.get(url,headers=headers,timeout=30) 38 html.encoding = html.apparent_encoding 39 soup = BeautifulSoup(html.text,'html.parser') 40 title = soup.find('title').text.split(' - ')[0] 41 print(title) 42 try: 43 os.mkdir('/home/admin/桌面/鬥圖/%s' % title) 44 except: 45 pass 46 list_1 = [] 47 s = soup.find_all(name='div',attrs={'class':"artile_des"}) 48 for x in s: 49 try: 50 b = x.find('img')['src'] 51 list_1.append(b) 52 except: 53 pass 54 for x in range(len(list_1)): 55 c = requests.get(list_1[x]).content 56 with open('/home/admin/桌面/鬥圖/%s/%s.jpg' % (title,x),'wb') as www: 57 www.write(c) 58 59 #處理單頁數據,這個函數將獲取到的包連接用img_url函數進行處理,將圖片下載到制定文件夾中。 60 def down_all(url,num): 61 for x in dan_url_list(url,num): 62 img_url(x) 63 #建立多線程。 64 def main(page_num): 65 print('...........Start:%s...............' % time.ctime()) 66 thr_list = [] 67 url = 'http://www.doutula.com/article/list/?page=' 68 for x in range(1,page_num+1): 69 t = New_thread(down_all,(url,x)) 70 thr_list.append(t) 71 #啓動線程 72 for x in thr_list: 73 x.start() 74 for x in thr_list: 75 x.join() 76 print('.........All Done: %s..............' % time.ctime()) 77 78 if __name__ == '__main__': 79 a = input('你想獲取多少頁表情包?') 80 main(int(a)) 81 82
謝謝你們的閱讀。