【发布时间】:2014-10-11 22:46:00
【问题描述】:
我有一个 csv 文件(“SomeSiteValidURLs.csv”),其中列出了我需要抓取的所有链接。该代码正在运行,并将通过 csv 中的 url,抓取信息并记录/保存在另一个 csv 文件(“Output.csv”)中。但是,由于我计划为网站的大部分内容(>10,000,000 个页面)执行此操作,因此速度很重要。对于每个链接,爬取信息并将信息保存到 csv 大约需要 1 秒,这对于项目的规模来说太慢了。所以我加入了多线程模块,令我惊讶的是它根本没有加速,它仍然需要 1 个人链接。我做错什么了吗?有没有其他方法可以加快处理速度?
没有多线程:
import urllib2
import csv
from bs4 import BeautifulSoup
import threading
def crawlToCSV(FileName):
with open(FileName, "rb") as f:
for URLrecords in f:
OpenSomeSiteURL = urllib2.urlopen(URLrecords)
Soup_SomeSite = BeautifulSoup(OpenSomeSiteURL, "lxml")
OpenSomeSiteURL.close()
tbodyTags = Soup_SomeSite.find("tbody")
trTags = tbodyTags.find_all("tr", class_="result-item ")
placeHolder = []
for trTag in trTags:
tdTags = trTag.find("td", class_="result-value")
tdTags_string = tdTags.string
placeHolder.append(tdTags_string)
with open("Output.csv", "ab") as f:
writeFile = csv.writer(f)
writeFile.writerow(placeHolder)
crawltoCSV("SomeSiteValidURLs.csv")
多线程:
import urllib2
import csv
from bs4 import BeautifulSoup
import threading
def crawlToCSV(FileName):
with open(FileName, "rb") as f:
for URLrecords in f:
OpenSomeSiteURL = urllib2.urlopen(URLrecords)
Soup_SomeSite = BeautifulSoup(OpenSomeSiteURL, "lxml")
OpenSomeSiteURL.close()
tbodyTags = Soup_SomeSite.find("tbody")
trTags = tbodyTags.find_all("tr", class_="result-item ")
placeHolder = []
for trTag in trTags:
tdTags = trTag.find("td", class_="result-value")
tdTags_string = tdTags.string
placeHolder.append(tdTags_string)
with open("Output.csv", "ab") as f:
writeFile = csv.writer(f)
writeFile.writerow(placeHolder)
fileName = "SomeSiteValidURLs.csv"
if __name__ == "__main__":
t = threading.Thread(target=crawlToCSV, args=(fileName, ))
t.start()
t.join()
【问题讨论】:
-
您可能受 I/O 限制,在这种情况下,在问题上投入更多内核将无济于事。
-
如何检查是否是这种情况?顺便说一句,我忘了提到我实际上已经测试过生成 50,000 个随机数,并且使用多线程代码它比没有的代码快得多(它有时会崩溃)。我的电脑是 Intel Core i5 M460 @ 2.53GHz,6GB RAM,运行 64 位 Windows 7。
-
您只是创建了一个线程,并让该线程遍历每个 URL。这根本不会加快速度。这与使用单个线程执行此操作完全相同,除了启动第二个线程的额外开销。
-
哦,我不知道,我看了网上的例子,并尝试自己实现代码。有没有描述创建多个线程的简单示例?
标签: multithreading python-2.7 parallel-processing web-scraping beautifulsoup