如何快速运行很多id?

时间:2017-12-12 18:16:32

标签: python

我目前正试图从网站上抓取大量的小网页。我已经知道当我有页面时该怎么做,但要浏览所有页面(超过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?

2 个答案:

答案 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)

您需要实施scrapevalid功能。
希望这对你有帮助。