python3網絡爬蟲(2.1):爬取堆糖美女
額,明明記得昨晚存了草稿箱,一覺醒來沒了,那就簡寫點(其實是具體怎麽解釋我也不太懂/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):爬取堆糖美女