我想要廢棄一個站點。大約有8000件物品需要報廢。我有問題,如果需要1秒鐘要求1件物品,那麼這些物品需要大約8000秒,這意味着大約需要134個薄荷糖和2.5小時。任何人都可以幫助解決如何做到這一點,並在同一時間做多個請求。我正在使用python urllib2來請求內容。Python用urllib2抓取數據並行請求
回答
使用更好的HTTP客戶端。 Urllib2以
Connection: close
發出請求,所以總是需要協商新的TCP連接。使用requests
,您可以重用該TCP連接。s = requests.Session() r = s.get("http://example.org")
並行發出請求。由於這是I/O綁定,因此可以使用GIL並且可以使用線程。您可以運行一些簡單的線程來下載一批網址,然後等待所有網址完成。但是,也許像「平行圖」將適合這更好 - 我發現這個答案與簡單的例子:
https://stackoverflow.com/a/3332884/196206
如果共享線程之間的任何事情,請確保它是線程安全的 - 請求會話對象似乎線程安全:https://stackoverflow.com/a/20457621/196206
更新 - 一個小例子:
#!/usr/bin/env python
import lxml.html
import requests
import multiprocessing.dummy
import threading
first_url = "http://api.stackexchange.com/2.2/questions?pagesize=10&order=desc&sort=activity&site=stackoverflow"
rs = requests.session()
r = rs.get(first_url)
links = [item["link"] for item in r.json()["items"]]
lock = threading.Lock()
def f(data):
n, link = data
r = rs.get(link)
doc = lxml.html.document_fromstring(r.content)
names = [el.text for el in doc.xpath("//div[@class='user-details']/a")]
with lock:
print("%s. %s" % (n+1, link))
print(", ".join(names))
print("---")
# you can also return value, they will be returned
# from pool.map() in order corresponding to the links
return (link, names)
pool = multiprocessing.dummy.Pool(5)
names_list = pool.map(f, enumerate(links))
print(names_list)
。如果我在同一時間得到了6個響應,那麼如何在lxml中使用它們來提取數據,同時它們將在當前場景中逐一提取,並將它們同時存入文件。 – user3324557
將'lxml'處理與下載一起寫入由並行'map'調用的函數。您也可以在那裏寫入文件,但使用鎖定(http://docs.python.org/2/library/threading.html#lock-objects)來排除並行文件寫入。 – Messa
你應該考慮使用Scrapy,而不是直接使用lxml和urllib。 Scrapy是一個快速的高級屏幕抓取和網頁爬行框架,用於抓取網站並從其頁面中提取結構化數據。「它建立在Twisted之上,因此它可以固有地異步,因此它非常非常快。
我不能給你對你的拼搶會快多少去任何具體的數字,但是想象一下,你的請求並行發生的,而不是連續。您仍然需要編寫代碼來使用xpath或Beautiful Soup來提取所需的信息,但是您不必去查找頁面。
儘管並行請求顯然更快,但請記住,不同的刮取目標對攻擊性刮取會有不同的反應。一個刮目標可以讓你的生活相當困難,如果他們關心(如果你不覆蓋你的軌道,甚至可能合法),所以一定要儘可能地尊重他們的願望。 –
- 1. https使用python獲取請求urllib2
- 2. Python抓取標題請求
- 3. 獲取的urllib2 http請求
- 4. Python和urllib2:如何使用參數進行GET請求
- 5. 使用Python的urllib2發起請求
- 6. 抓取時請求?
- 7. 抓取AJAX請求
- 8. 骨幹收集抓取並請求
- 9. Python數據抓取
- 10. 使用python抓取數據
- 11. 用python請求和urllib2解釋POST多部分請求
- 12. 使用Python的urllib2發送POST請求並得到響應
- 13. scrapy/Python抓取但不抓取數據
- 14. 使用Python獲取頭文件並將其轉換爲JSON(請求 - urllib2 - json)
- 15. 從urllib2遷移到請求python 2.7
- 16. 的Python - urllib2.HTTPError 400錯誤的請求
- 17. Python urllib2或請求後的方法
- 18. Python的urllib2的請求超時
- 19. python在響應之前的urllib2請求
- 20. Python的urllib2的請求HTTPS失敗
- 21. Python的urllib2的請求錯誤
- 22. python請求網址並行
- 23. GitKraken:抓取請求失敗
- 24. 從請求中抓取參數
- 25. 獲取Urllib2.Request的請求頭文件?
- 26. Python 3.4.1 - 讀取HTTP請求數據
- 27. Python:Twitter使用「請求(POST)」功能抓取
- 28. HTTP請求GET JSON並讀取數據
- 29. 取消http.get請求並還原數據
- 30. Python - 如何啓用Cookie與Web請求抓取?
如果你這樣做,你可能會得到來自你想放棄[原文]該網站禁止。您是否閱讀過他們的使用條款?如果你放棄他們的網站,他們可以嗎? –
是的,他們允許刮。我只需要我的場景的答案。 – user3324557
研究使用蟒蛇刮刀,如美麗的湯或鬥犬。我知道scrappy可以創建多個蜘蛛並且同時啓動它們以便同時掃描網址[默認情況下12個蜘蛛]。爲了快速反應,我們使用了thanx –