鬥圖表情包爬蟲(基於多線程)

今天寫一下關於多線程的爬蟲,此次咱們爬取的是鬥圖網站的表情包。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     

 

 

謝謝你們的閱讀。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息