爬蟲:爬取男人團女優們的封面

来源:https://www.cnblogs.com/xxxxf/archive/2018/11/16/9972109.html
-Advertisement-
Play Games

將同一個女優的放到一個文件夾,用 防止新建文件夾錯誤,但註釋掉後還能正常運行,有待觀察 ...


爬取後發現有一些女優並沒有新建文件夾存放,居然有些title屬性為空。

最主要的是沒有使用代理,IP被封了。。。。。。。。。

將同一個女優的放到一個文件夾,用

threading.Lock()

防止新建文件夾錯誤,但註釋掉後還能正常運行,有待觀察

 

from lxml import etree
import requests
import os
import re
from urllib import request
import threading
from queue import Queue
from threading import Lock
base = 'http://nanrenvip.xyz'
headers = {
'User-Agent': '~~~~~~~~~~~~~~~',
'Referer': 'http://nanrenvip.xyz/nvyouku/1-0-0-0-0-0-0.html'
}


class Producer(threading.Thread):
"""在女優列表中提取每人的姓名和鏈接,name 用於分文件夾, 最後一直傳遞到img中"""
def __init__(self, pages, women_pages, *args, **kwargs):
super(Producer, self).__init__(*args, **kwargs)
self.pages = pages
self.women_pages = women_pages

def run(self):
while True:
if self.pages.empty():
break
url = self.pages.get()
self.get_women(url)

def get_women(self, url):
response = requests.get(url, headers=headers)
text = response.content.decode('utf-8')
html = etree.HTML(text)
box = html.xpath('//div[@class="list_box"]//div[@class="list_l"]//li')[:15]
for each in box:
name = each.xpath('./a/@title')[0]
her_url = each.xpath('./a/@href')[0]
women = {'name': name, 'url': base + her_url}
self.women_pages.put(women)


class Producer_2(threading.Thread):
"""獲取女優詳情頁所有番號鏈接以及標題, 標題用來命名圖片"""
def __init__(self, pages, women_pages, avs, *args, **kwargs):
super(Producer_2, self).__init__(*args, **kwargs)
self.pages = pages
self.women_pages = women_pages
self.avs = avs

def run(self):
while True:
if self.pages.empty() and self.women_pages.empty():
break
women = self.women_pages.get()
self.get_av_list(women)

def get_av_list(self, women):
url = women['url']
name = women['name']
response = requests.get(url, headers=headers)
text = response.content.decode('utf-8')
html = etree.HTML(text)
lst = html.xpath('//div[@class="zp_list"]')[0]
text = etree.tostring(lst, encoding='utf-8').decode('utf-8')
avs = re.findall(r'<a href="(.*?)">(.*?)</a>', text, re.DOTALL)
for each in avs:
her_url = base + each[0]
her_title = each[1]
av_list = {'url': her_url, 'title': her_title, 'name': name}
self.avs.put(av_list)


class Producer_3(threading.Thread):
"""獲取該番號的圖片src, 加上name title"""
def __init__(self, pages, women_pages, avs, imgs, *args, **kwargs):
super(Producer_3, self).__init__(*args, **kwargs)
self.pages = pages
self.women_pages = women_pages
self.avs = avs
self.imgs = imgs

def run(self):
while True:
if self.pages.empty() and self.women_pages.empty() and self.avs.empty():
break
av = self.avs.get()
self.get_imgs(av)

def get_imgs(self, av):
url = av['url']
name = av['name']
title = av['title']
response = requests.get(url, headers=headers)
text = response.content.decode('utf-8')
html = etree.HTML(text)
tar = html.xpath('//div[@class="artCon"]')[0]
text = etree.tostring(tar, encoding='utf-8').decode('utf-8')
src = re.findall(r'data-original="(.*?)"', text, re.DOTALL)[0]
src = base + src
img = {}
img['name'] = name
img['title'] = title
img['src'] = src
self.imgs.put(img)


class Consumer(threading.Thread):
"""下載圖片, lock 防止出現新建文件夾時錯誤"""
def __init__(self, pages, women_pages, avs, imgs, lock, *args, **kwargs):
super(Consumer, self).__init__(*args, **kwargs)
self.pages = pages
self.women_pages = women_pages
self.avs = avs
self.imgs = imgs
self.lock = lock

def run(self):
while True:
if self.pages.empty() and self.women_pages.empty() and self.avs.empty() and self.imgs.empty():
break
img = self.imgs.get()
self.download(img)

def download(self, img):
src = img['src']
name = img['name']
title = img['title']
self.lock.acquire()
if not os.path.exists('vip/'+name):
os.makedirs('vip/'+name)
self.lock.release()
try:
request.urlretrieve(src, './vip/%s/%s.jpg' % (name, title))
except:
print(src)


def main():
base_url = 'http://nanrenvip.xyz/nvyouku/1-0-0-0-0-0-{}.html'
pages = Queue(60)
women_pages = Queue(1000)
avs = Queue(100000)
imgs = Queue(100000)
lock = threading.Lock()
for x in range(55):
url = base_url.format(x)
pages.put(url)
for x in range(2):
Producer(pages, women_pages).start()
for x in range(10):
Producer_2(pages, women_pages, avs).start()
for x in range(10):
Producer_3(pages, women_pages, avs, imgs).start()
for x in range(10):
Consumer(pages, women_pages, avs, imgs, lock).start()


if __name__ == '__main__':
main()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝 SmartSql.ZooKeeperConfig Demo 工具使用 "ZooKeeper Admin" ...
  • 一.Actor模型介紹 在單核 CPU 發展已經達到一個瓶頸的今天,要增加硬體的速度更多的是增加 CPU 核的數目。而針對這種情況,要使我們的程式運行效率提高,那麼也應該從併發方面入手。傳統的多線程方法又極其容易出現 Bug 而難以維護,不過別擔心,今天將要介紹另一種併發的模式能一定程度解決這些問題 ...
  • Map 遍歷: ...
  • Java中return用於方法,兩個作用: (1)返回方法指定類型的值(這個值總是確定的),也可以是對象 (2)方法的結束 兩種形式: (1)有返回類型 例如:return i; (2)無返回類型 return; 一般方法前有void代表無返回值,沒有void有返回值。 “break”語句用來結束循 ...
  • 有一段時間沒寫博客了,雖然是菜鳥一枚但畢竟總要有東西記錄學習的,我相信有志者事竟成。今天在工作中使用Jackson轉換了一個javabean,傳到測試服上之後發現日期少了一天,使用的是@JsonFormat註解。這裡寫了一個簡單的小demo記錄一下: 表數據: 實體類屬性: controller層就 ...
  • 小魯班今年電腦專業大四了,在學校可學了不少軟體開發的東西,也自學了一些JAVA的後臺框架,躊躇滿志,一心想著找個好單位實習。當投遞了無數份簡歷後,終於收到了一個公司發來的面試通知,小魯班欣喜若狂。 到了人家單位後,前臺小姐姐給了小魯班一份筆試題目,要求在一個小時內完成,小魯班雙手接過題目後,粗略的 ...
  • 1 # r"(?P<name>正則)" 2 3 import re 4 res = re.search('e','leiyunse') # 搜索 搜到 一個 結果就返回 5 print(res.group()) # e 6 7 res = re.match('\w+','wuwu is not go ...
  • Python基礎知識(5):基本數據類型之字元串(Ⅱ) 字元串方法 17.join:對字元串進行拼接 結果: 'clialin' 18.ljust、rjust使字元串左(右對齊),並用某個字元對右(左端)進行填充 結果: God##############God 19.zfill:在字元串左端填充“ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...