我目前正试图从网站上抓取大量的小网页。我已经知道当我有页面时该怎么做,但要浏览所有页面(超过5000个),我发现所有单独的页面网址都像:blablabla?id=1957-002A-02
。
我将网址划分为4个部分:前4位数字(从1957年到2017年只有一年),然后是连字符3位数(仅计数)和一个字母(相同)之后和另一个连字符2位数(计数)向上)。
我所知道的:有一个限制(让我解释一下):
1957-002A-01
有一些我关心的文字
1957-002A-02
有一些我关心的文字
1957-002A-03
没有任何有趣的文字(我可以检测到它),我可以直接跳到:
1957-002B-01
有一些我关心的文字
1957-002B-02
有一些我关心的文字
1957-002B-03
有一些我关心的文字
1957-002B-04
没有任何有趣的文字,我跳过:
1957-002C-01
没有任何有趣的东西,我跳过:
1957-002D-02
是连续第二次拥有任何东西,所以我跳到下一封信:
1957-003A-01
,等等......
如何在能够随时跳过的情况下浏览大量ID?
答案 0 :(得分:0)
我想你必须编写自己的逻辑来跳转到下一个这样的id。让你前进的东西:
years = [str(y) for y in range(1957, 1980)]
numbers = [str(k).rjust(3, "0") for k in range(1, 100)]
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
pages = [str(p).rjust(2, "0") for p in range(1, 20)]
params = [years, numbers, letters, pages]
def next_index(current):
current = list(current)
i = 3
while i >= 0:
current[i] = (current[i] + 1) % len(params[i])
if current[i] == 0:
i -= 1
else:
return current
def next_skip(indices, skip_level):
indices = list(indices)
# There are four parts to the id
# skip level decides (from the left), which components to reset
for i in range(skip_level + 1, 4):
indices[i] = 0
indices[skip_level] = (indices[skip_level] + 1) % len(params[skip_level])
return indices
def make_element(indices):
first = years[indices[0]]
middle = numbers[indices[1]] + letters[indices[2]]
last = pages[indices[3]]
return "-".join([first, middle, last])
indices = [4, 4, 4, 5]
print(make_element(indices)) # 1961-005E-05 Original
print(make_element(next_index(indices))) # 1961-005E-06 Regular increment
print(make_element(next_skip(indices, 0))) # 1962-001A-00 (Increments year)
print(make_element(next_skip(indices, 1))) # 1961-006A-00 (Increments number)
print(make_element(next_skip(indices, 2))) # 1961-005F-00 (Increments letter)
这基本上做的是在自定义基数中计算,然后根据该基数的数字对元素进行索引。 next_index
函数定期增量。
next_skip
函数可以获取一个参数,它将递增,并将所有较低的组件重置为零,完全按照您在问题中发布的方式。
我担心你必须编写自己的逻辑来决定何时跳过,以及在什么级别跳过。
希望这有帮助!
干杯!
答案 1 :(得分:0)
这是一个伪代码:
def make_id():
for year in range(1957, 2018):
for num_1 in range(0, 999):
for letter in ['a', 'b', ... , 'z']:
for num_2 in range(0, 100):
yield "{}-{}-{}-{}".format(year, num_1, letter, num_2)
for i in make_id():
url = "blablabla?id={}".format(i)
if valid(url):
scrape(url)
您需要实施scrape
和valid
功能。
希望这对你有帮助。