大家好呀,我是辣條,
寫這篇文章的靈感來源于之前和朋友的聊天,真的無力吐槽了,想發適合的表情包懟回去卻發現收藏的表情包就那幾個,就想著是不是可以爬取一些表情包,再也不用尬聊了,
先給大家看看我遇到的聊天最尬的場面:


斗圖吧圖片采集
- 抓取目標
- 工具使用
- 重點內容學習
- 專案思路分析
- 整理需求
- 簡易原始碼分享
抓取目標
網站:斗圖吧

工具使用
開發環境:win10、python3.7
開發工具:pycharm、Chrome
工具包:requests、etree
重點內容學習
1.Q佇列儲存資料資訊
2.py多執行緒使用方法
3.xpath語法學習
專案思路分析
根據你需要的關鍵字搜索對應的圖片資料
搜索的關鍵字和頁數根據改變對應的url
https://www.doutula.com/search?type=photo&more=1&keyword={}&page={}
將對應的url地址保存在page佇列里
page_q = Queue()
img_q = Queue()
for x in range(1, 11):
url = 'https://www.doutula.com/search?type=photo&more=1&keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&page={}'.format(x)
page_q.put(url)

通過xpath方式提取當前頁面的url地址以及圖片的名字
將提取到的圖片和地址存盤在img佇列里
def parse_page(self, url):
response = requests.get(url, headers=self.headers).text
# print(response)
html = etree.HTML(response)
images = html.xpath('//div[@class="random_picture"]')
for img in images:
img_url = img.xpath('.//img/@data-original')
# 獲取圖片名字
print(img_url)
alt = img.xpath('.//p/text()')
for name, new_url in zip(alt, img_url):
filename = re.sub(r'[??.,,!!*\\/|]', '', name) + ".jpg"
# 獲取圖片的后綴名
# suffix = os.path.splitext(img_url)[1]
# print(alt)
self.img_queue.put((new_url, filename))

根據圖片地址下載保存圖片
保存圖片是要根據圖片url來判斷保存的后綴(我統一保存的jpg,問就是因為懶癌晚期)
整理需求
- 創建兩個執行緒類,一個用來提取網頁圖片資料,一個保存圖片資料
- 創建兩個佇列,一個保存page的url, 一個保存圖片的url和名字
- 通過xpath的方法提取出網址的圖片地址
簡易原始碼分享
import requests
from lxml import etree
import re
from queue import Queue
import threading
class ImageParse(threading.Thread):
def __init__(self, page_queue, img_queue):
super(ImageParse, self).__init__()
self.page_queue = page_queue
self.img_queue = img_queue
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
def run(self):
if self.page_queue.empty():
break
url = self.page_queue.get()
self.parse_page(url)
def parse_page(self, url):
response = requests.get(url, headers=self.headers).text
# print(response)
html = etree.HTML(response)
images = html.xpath('//div[@class="random_picture"]')
for img in images:
img_url = img.xpath('.//img/@data-original')
# 獲取圖片名字
print(img_url)
alt = img.xpath('.//p/text()')
for name, new_url in zip(alt, img_url):
filename = re.sub(r'[??.,,!!*\\/|]', '', name) + ".jpg"
# 獲取圖片的后綴名
# suffix = os.path.splitext(img_url)[1]
# print(alt)
self.img_queue.put((new_url, filename))
class Download(threading.Thread):
def __init__(self, page_queue, img_queue):
super(Download, self).__init__()
self.page_queue = page_queue
self.img_queue = img_queue
def run(self):
if self.img_queue.empty() and self.page_queue.empty():
break
img_url, filename = self.img_queue.get()
with open("表情包/" + filename, "wb")as f:
response = requests.get(img_url).content
f.write(response)
print(filename + '下載完成')
def main():
# 建立佇列
page_q = Queue()
img_q = Queue()
for x in range(1, 11):
url = 'https://www.doutula.com/search?type=photo&more=1&keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&page={}'.format(x)
page_q.put(url)
for x in range(5):
t = ImageParse(page_q, img_q)
t.start()
t = Download(page_q, img_q)
t.start()
if __name__ == '__main__':
main()
PS:表情包在手,聊天永不尬,沒什么事是一個表情包解決不了的,如果有那就多發幾個!對你有用的話給辣條一個三連吧,感謝啦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287938.html
標籤:其他
