寫在前面 今天在CSDN博客,發現好多人寫爬蟲都在爬取一個叫做 的網站,裡面很多表情包,然後瞅了瞅,各種實現方式都有,今天我給你實現一個多線程版本的。關鍵技術點 ,你可以看一下我前面的文章,然後在學習一下。 網站就不分析了,無非就是找到規律,拼接URL,匹配關鍵點,然後爬取。 擼代碼 首先快速的導入 ...
寫在前面
今天在CSDN博客,發現好多人寫爬蟲都在爬取一個叫做鬥圖啦
的網站,裡面很多表情包,然後瞅了瞅,各種實現方式都有,今天我給你實現一個多線程版本的。關鍵技術點 aiohttp
,你可以看一下我前面的文章,然後在學習一下。
網站就不分析了,無非就是找到規律,拼接URL,匹配關鍵點,然後爬取。
擼代碼
首先快速的導入我們需要的模塊,和其他文章不同,我把相同的表情都放在了同一個文件夾下麵,所以需要導入os
模塊
import asyncio
import aiohttp
from lxml import etree
import os
編寫主要的入口方法
if __name__ == '__main__':
url_format = "http://www.doutula.com/article/list/?page={}"
urls = [url_format.format(index) for index in range(1,586)]
loop = asyncio.get_event_loop()
tasks = [x_get_face(url) for url in urls]
results = loop.run_until_complete(asyncio.wait(tasks))
我們是為了學習,不是為了攻擊別人伺服器,所以限制一下併發數量
sema = asyncio.Semaphore(3)
async def x_get_face(url):
with(await sema):
await get_face(url)
最後,一頓操作猛如虎,把所有的代碼補全,就搞定了,這部分沒有什麼特別新鮮的地方,找圖片鏈接,然後下載。
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
async def get_face(url):
print("正在操作{}".format(url))
async with aiohttp.ClientSession() as s:
async with s.get(url,headers=headers,timeout=5) as res:
if res.status==200:
html = await res.text()
html_format = etree.HTML(html)
hrefs = html_format.xpath("//a[@class='list-group-item random_list']")
for link in hrefs:
url = link.get("href")
title = link.xpath("div[@class='random_title']/text()")[0] # 獲取文件頭部
path = './biaoqings/{}'.format(title.strip()) # 硬編碼了,你要先在項目根目錄創建一個biaoqings的文件夾
if not os.path.exists(path):
os.mkdir(path)
else:
pass
async with s.get(url, headers=headers, timeout=3) as res:
if res.status == 200:
new_html = await res.text()
new_html_format = etree.HTML(new_html)
imgs = new_html_format.xpath("//div[@class='artile_des']")
for img in imgs:
try:
img = img.xpath("table//img")[0]
img_down_url = img.get("src")
img_title = img.get("alt")
except Exception as e:
print(e)
async with s.get(img_down_url, timeout=3) as res:
img_data = await res.read()
try:
with open("{}/{}.{}".format(path,img_title.replace('\r\n',""),img_down_url.split('.')[-1]),"wb+") as file:
file.write(img_data)
except Exception as e:
print(e)
else:
pass
else:
print("網頁訪問失敗")
等著,大量的表情包就來到了我的碗里。