2014-02-18 43 views
-1

我想要廢棄一個站點。大約有8000件物品需要報廢。我有問題,如果需要1秒鐘要求1件物品,那麼這些物品需要大約8000秒,這意味着大約需要134個薄荷糖和2.5小時。任何人都可以幫助解決如何做到這一點,並在同一時間做多個請求。我正在使用python urllib2來請求內容。Python用urllib2抓取數據並行請求

+0

如果你這樣做,你可能會得到來自你想放棄[原文]該網站禁止。您是否閱讀過他們的使用條款?如果你放棄他們的網站,他們可以嗎? –

+0

是的,他們允許刮。我只需要我的場景的答案。 – user3324557

+0

研究使用蟒蛇刮刀,如美麗的湯或鬥犬。我知道scrappy可以創建多個蜘蛛並且同時啓動它們以便同時掃描網址[默認情況下12個蜘蛛]。爲了快速反應,我們使用了thanx –

回答

4
  1. 使用更好的HTTP客戶端。 Urllib2以Connection: close發出請求,所以總是需要協商新的TCP連接。使用requests,您可以重用該TCP連接。

    s = requests.Session() 
    r = s.get("http://example.org") 
    
  2. 並行發出請求。由於這是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) 
+0

。如果我在同一時間得到了6個響應,那麼如何在lxml中使用它們來提取數據,同時它們將在當前場景中逐一提取,並將它們同時存入文件。 – user3324557

+0

將'lxml'處理與下載一起寫入由並行'map'調用的函數。您也可以在那裏寫入文件,但使用鎖定(http://docs.python.org/2/library/threading.html#lock-objects)來排除並行文件寫入。 – Messa

0

你應該考慮使用Scrapy,而不是直接使用lxml和urllib。 Scrapy是一個快速的高級屏幕抓取和網頁爬行框架,用於抓取網站並從其頁面中提取結構化數據。「它建立在Twisted之上,因此它可以固有地異步,因此它非常非常快。

我不能給你對你的拼搶會快多少去任何具體的數字,但是想象一下,你的請求並行發生的,而不是連續。您仍然需要編寫代碼來使用xpath或Beautiful Soup來提取所需的信息,但是您不必去查找頁面。

+0

儘管並行請求顯然更快,但請記住,不同的刮取目標對攻擊性刮取會有不同的反應。一個刮目標可以讓你的生活相當困難,如果他們關心(如果你不覆蓋你的軌道,甚至可能合法),所以一定要儘可能地尊重他們的願望。 –