【发布时间】:2014-10-12 02:54:37
【问题描述】:
我想抓取网站的大部分内容。比如说,一般的 url 结构如下:
https://ExampleSite.com/XXXXX,其中 X 可以是任何数字或大写字母。 即https://ExampleSite.com/32E4Z,https://ExampleSite.com/AA44P
字符总数为 36,包括数字和字母。由于有 5 个随机插槽,因此总 url 组合变成了可怕的 36^5 = 60,466,176。在这些链接中,只有一小部分(20%)实际上有一个有效页面,基于“examplesite.com”前面的 url 的其他组合返回无效链接,我没有抓取任何东西(但我想我仍然需要检查该 URL 组合是否有效并包含“特定标题”?)。
这是我正在运行的 Python/BeautifulSoup 代码,我的目标是通过这些 url 组合并提取与“特定标题”匹配的有效链接:
import urllib2
import re
import csv
from bs4 import BeautifulSoup
import threading
def get_Siteinfo(varURLpart1, varURLpart2, varURLpart3, varURLpart4, varURLpart5):
for loop1 in range(0, varURLpart1):
for loop2 in range(0, varURLpart2):
for loop3 in range(0, varURLpart3):
for loop4 in range(0, varURLpart4):
for loop5 in range(0, varURLpart5):
URLchar = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] # len(URLchar) = 36
url1 = "https://ExampleSite.com/"
urlComplete = url1 + str(URLchar[loop1]) + str(URLchar[loop2]) + \
str(URLchar[loop3]) + str(URLchar[loop4]) + str(URLchar[loop5])
page = urllib2.urlopen(urlComplete)
soup_SomeSiteURL = BeautifulSoup(page, "lxml")
page.close()
Subhead = soup_SomeSiteURL.find("span", class_="subhead")
if Subhead: # If-statement solution; if "subhead" class is found
SubheadString = Subhead.get_text(strip=True) # then extract the string
if SubheadString == "Specific heading":
saveFile = open('SomeSiteValidURLs.csv', 'a')
saveFile.write(str(urlComplete)+'\n')
saveFile.close()
loop5 += 1
loop4 += 1
loop3 += 1
loop2 += 1
loop1 += 1
get_Siteinfo(36, 36, 36, 36, 36)
我的问题是处理速度慢,而且要经过许多无效链接的负担。我发现每个 url 需要大约 1 秒的时间才能完成,计算出 60,466,176 种组合将需要大约 2 年的时间在我的计算机上一直运行。这显然是不适用的。所以我的问题是:
- 我在循环内的循环上做错了吗?
- 有什么方法可以避免快速或完全通过无效链接的需要?
- 正则表达式有帮助吗?
- 我的下一步是实现多线程。不过,我已经在其他程序中尝试过,虽然它有效,但它只将处理时间减少了一半,因此仍然需要一整年不间断地运行程序。
- 或者我可以加快进程的任何其他提示?
【问题讨论】:
标签: performance python-2.7 web-scraping beautifulsoup urllib2