1. 程式人生 > >python3網絡爬蟲(2.1):爬取堆糖美女

python3網絡爬蟲(2.1):爬取堆糖美女

pre 線程 span 需要 pic ring clas lin chrome

額,明明記得昨晚存了草稿箱,一覺醒來沒了,那就簡寫點(其實是具體怎麽解釋我也不太懂/xk,純屬個人理解,有錯誤還望指正)

環境:

  版本:python3

  IDE:pycharm2017.3.3

  瀏覽器:火狐(瀏覽器建議火狐,Chrome)

  爬取網站:堆糖

選堆糖是因為比較好爬取(除了img文件就是xhr文件),別網站的反爬取對我這個水平來說都太心機了

安裝配置什麽的之前都寫過,這裏就不提了,直接開始

1.先來瀏覽一下這個網站,打開堆糖官網,搜索校花,他就會給我們推薦一些圖片,當我們滾動到頁面底部時,他又會加載新的一些圖片,再滾到底,再加載,這樣加載了五次,才把第一頁的所有圖片加載出來(這裏體現了這個網站的防爬,不過也好破)

我們的目標就是把這19頁,每頁的圖片都爬下來

技術分享圖片

2.重新搜索一下關鍵字,我們先不往下滾動,右鍵查看元素,選擇網絡,可以看到目前這一頁中加載的圖片,

技術分享圖片

3.然後我們把頁面往下滾動,讓他繼續加載,同時我們觀察者網絡這個窗口,所有請求的圖片也都顯示在這裏,這時發現xhr類型的文件,這樣的文件一共有五個,也就是同一頁面中每次滾動到頁面底部,新加載圖片時就會出現這樣的文件

技術分享圖片

4.主要關註一下這個文件,把窗口切換到xhr類型下,雙擊打開其中的一個

技術分享圖片

5.這個請求網址使我們需要的,復制到地址欄中

技術分享圖片

6.這裏打開如果是所有代碼堆在一起的那樣,就需要在線解析一下,解析工具 將地址復制進去進行校驗

技術分享圖片

技術分享圖片

  而我這裏的火狐瀏覽器打開直接就是轉換好的

技術分享圖片

  其中的path就是我們需要的

技術分享圖片

而這個limit就是限制我們爬取數量的參數,後面需要修改這個參數來爬取全部圖片

技術分享圖片

7.對請求地址進行分析

https://www.duitang.com/napi/blog/list/by_search/?kw=校花&type=feed&include_fields=top_comments,is_root,source_link,item,buyable,root_id,status,like_count,sender,album&_type=&start=24&_=1520036797589

  將沒用的刪掉

https://www.duitang.com/napi/blog/list/by_search/?kw=校花&start=24

  修改參數start(從0開始爬取),添加參數limit(上限),格式都是&開頭

https://www.duitang.com/napi/blog/list/by_search/?kw=校花&start=0&limit=1000

以上就是爬取的分析過程,代碼如下

 1 import requests
 2 import urllib.parse
 3 import threading
 4 #設置最大線程value
 5 thread_lock = threading.BoundedSemaphore(value=10)
 6 
 7 
 8 #通過url獲取數據
 9 def get_page(url):
10     page = requests.get(url)
11     page = page.content
12     #將bytes轉成字符串
13     page = page.decode(utf-8)
14     return page
15 #label為關鍵字
16 def pages_from_duitang(label):
17     pages = []
18     url = https://www.duitang.com/napi/blog/list/by_search/?kw={}&start=0&limit=1000
19     #將中文轉成url編碼
20     label = urllib.parse.quote(label)
21     for index in range(0, 3600, 100):
22         u = url.format(label, index)
23         print(u)
24         page = get_page(u)
25         pages.append(page)
26         return pages
27 
28 
29 #通過切片提取路徑
30 def findall_in_page(page, startpart, endpart):
31     all_strings = []
32     end = 0
33     while page.find(startpart, end) != -1:
34         start = page.find(startpart, end) + len(startpart)
35         end = page.find(endpart, start)
36         string = page[start:end]
37         all_strings.append(string)
38     return all_strings
39 #返回所有圖片的鏈接
40 def pic_urls_from_pages(pages):
41     pic_urls = []
42     for page in pages:
43         urls = findall_in_page(page, path":", ")
44         pic_urls.extend(urls)
45     return pic_urls
46 #下載圖片
47 def download_pics(url, n):
48     r = requests.get(url)
49     path = ../pics/ + str(n) + .jpg
50     with open(path, wb) as f:
51         f.write(r.content)
52     #解鎖
53     thread_lock.release()
54 
55 def main(label):
56     pages = pages_from_duitang(label)
57     pic_urls = pic_urls_from_pages(pages)
58     n = 0
59     for url in pic_urls:
60         n += 1
61         print("正在下載第{}張圖片".format(n))
62         #上鎖
63         thread_lock.acquire()
64         t = threading.Thread(target=download_pics, args=(url, n))
65         t.start()
66 
67 
68 main(校花)

pics是我們需要新建的文件夾

目錄結構如下,d2018.3.2_urlopen.py是代碼,pics是用來存圖片的文件夾

技術分享圖片

運行結果

技術分享圖片

技術分享圖片

技術分享圖片

校花們就都存入囊中了,但是數量有點少,只有100個,好像是只爬取了一頁的圖片,代碼應該還有點小問題

不同的網站防爬不一樣,但思路應該都差不多

python3網絡爬蟲(2.1):爬取堆糖美女