回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>**<strong>在帖子末尾添加了问题摘要</strong>**</p>
<p>我写了一个抓取和解析网址的爬虫程序。在</p>
<p>在第一个版本中,为了得到下一个有效的页面,我增加了URL ID并将无效ID保存到一个文件中,有效的URL被移动到解析我需要的内容的解析器中,过了一会儿,我发现大多数有效的ID都有一个返回的子线程。在</p>
<p>我做了一些统计,得到了一系列的副标题-[8,18,7,17,6,16,5,15],按重复次数最多到最少排序。在</p>
<p>所以我<a href="https://stackoverflow.com/questions/6809402/python-maximum-recursion-depth-exceeded-while-calling-a-python-object">changed my code</a>来-</p>
<pre><code>def checkNextID(ID):
numOfRuns = 0
global curRes, lastResult
while ID < lastResult:
try:
numOfRuns += 1
if numOfRuns % 10 == 0:
time.sleep(7) # sleep every 10 iterations
numOfRuns = 0
if isValid(ID + 8):
parseHTML(curRes, ID)
ID = ID + 8
elif isValid(ID + 18):
parseHTML(curRes, ID)
ID = ID + 18
elif isValid(ID + 7):
parseHTML(curRes, ID)
ID = ID + 7
elif isValid(ID + 17):
parseHTML(curRes, ID)
ID = ID + 17
elif isValid(ID+6):
parseHTML(curRes, ID)
ID = ID + 6
elif isValid(ID + 16):
parseHTML(curRes, ID)
ID = ID + 16
elif isValid(ID + 5):
parseHTML(curRes, ID)
ID = ID + 5
elif isValid(ID + 15):
parseHTML(curRes, ID)
ID = ID + 15
else:
if isValid(ID + 1):
parseHTML(curRes, ID)
ID = ID + 1
except Exception, e:
print "something went wrong: " + str(e)
</code></pre>
<p><strong>isValid()</strong>是一个函数,它获取一个ID+其中一个子线程,如果url包含我需要的内容,则返回True,并将url的soup对象保存到名为“curRes”的全局变量中;如果url不包含我需要的数据,则返回False,并将ID保存到“baddfile”。在</p>
<p><strong>parseHTML</strong>是一个函数,它获取soup对象(curRes),解析我需要的数据,然后将数据保存到csv,然后返回True。在</p>
<p>在一个完美的世界里,这段代码就是我在所有有效ID上运行所需的一切(5M范围内大约有400K个),它让我在更短的时间内获得更好的结果(x50更快)。在</p>
<p>但是,当到达不包含任何有效URL的范围时,我的代码效率非常低,在每次迭代中我都会一遍又一遍地爬行相同的URL,这是因为我将ID增加一个,以便继续前进,直到找到下一个有效的URL,然后检查ID+8,然后检查18,17等',有时给我相同的网址,我在上一次迭代检查。在</p>
<p>所以我去修改了代码,这样它将保留一组无效的url,我将避免再次检查,我不能让它工作,我打破了我的头几个小时,它没有正常工作。在</p>
<p>这是我的新功能-</p>
^{pr2}$
<p>我将每个无效的ID保存到一个集合中,在每次调用isValid()之前,我会检查是否已经尝试过该ID,如果没有,则调用isValid(),否则,ID将增加一个。在</p>
<p>坏的ID文件就是这样-</p>
<pre><code>513025328
513025317
513025327
513025316
513025326
513025312
513025320
513025330
513025319
513025329
513025318
513025328
513025317
513025327
513025313
513025321
513025331
513025320
513025330
513025319
513025329
513025318
513025328
513025314
513025322
513025332
513025321
513025331
513025320
513025330
513025319
513025329
513025315
513025323
513025333
513025322
513025332
513025321
513025331
513025320
513025330
513025316
513025324
513025334
513025323
513025333
513025322
513025332
513025321
513025331
513025317
513025325
513025335
513025324
513025334
513025323
513025333
513025322
513025332
513025318
513025326
513025336
513025325
513025335
513025324
513025334
513025323
513025333
513025319
513025327
513025337
513025326
513025336
513025325
513025335
513025324
513025334
513025320
513025328
513025338
513025327
513025337
513025326
513025336
513025325
513025335
513025321
513025329
513025339
513025328
513025338
513025327
513025337
513025326
513025336
513025322
513025330
513025340
513025329
513025339
513025328
513025338
513025327
513025337
513025323
513025331
513025341
513025330
513025340
513025329
513025339
513025328
513025338
513025324
513025332
513025342
513025331
513025341
513025330
513025340
513025329
513025339
513025325
513025333
513025343
513025332
513025342
513025331
513025341
513025330
513025340
513025326
513025334
513025344
513025333
513025343
513025332
513025342
513025331
513025341
513025327
513025335
513025345
513025334
513025344
513025333
513025343
513025332
513025342
513025328
513025336
513025346
513025335
513025345
513025334
513025344
513025333
513025343
513025329
513025337
513025347
513025336
513025346
513025335
513025345
513025334
513025344
513025330
513025338
513025348
513025337
513025347
513025336
513025346
513025335
513025345
513025331
513025339
513025349
513025338
513025348
513025337
513025347
513025336
513025346
513025332
513025340
513025350
513025339
513025349
513025338
513025348
513025337
513025347
513025333
513025341
513025351
513025340
513025350
513025339
513025349
513025338
513025348
513025334
513025342
513025352
513025341
513025351
513025340
513025350
513025339
513025349
513025335
513025343
513025353
513025342
513025352
513025341
513025351
513025340
513025350
513025336
513025344
513025354
513025343
513025353
513025342
513025352
513025341
513025351
513025337
513025345
513025355
513025344
513025354
513025343
513025353
513025342
513025352
513025338
513025346
513025356
513025345
513025355
513025344
513025354
513025343
513025353
513025339
513025347
513025357
513025346
513025356
513025345
513025355
513025344
513025354
513025340
513025348
513025358
513025347
513025357
513025346
513025356
513025345
513025355
513025341
513025349
513025359
513025348
513025358
513025347
513025357
513025346
513025356
513025342
513025350
513025360
513025349
513025359
513025348
513025358
513025347
513025357
513025343
513025351
513025361
513025350
513025360
513025349
513025359
513025348
513025358
513025344
513025352
513025362
513025351
513025361
513025350
513025360
513025349
513025359
513025345
513025353
513025363
513025352
513025362
513025351
513025361
513025350
513025360
513025346
513025354
513025364
513025353
513025363
513025352
513025362
513025351
513025361
513025347
513025355
513025365
513025354
513025364
513025353
513025363
513025352
513025362
513025348
513025356
513025366
513025355
513025365
513025354
513025364
513025353
513025363
513025349
513025357
513025367
513025356
513025366
513025355
513025365
513025354
513025364
513025350
513025358
513025368
513025357
513025367
513025356
513025366
513025355
513025365
513025351
513025359
513025369
513025358
513025368
513025357
513025367
513025356
513025366
513025352
513025360
513025370
513025359
513025369
513025358
513025368
513025357
513025367
513025353
513025361
513025371
513025360
513025370
513025359
513025369
513025358
513025368
513025354
513025362
513025372
513025361
513025371
513025360
513025370
513025359
513025369
513025355
513025363
513025373
513025362
513025372
513025361
513025371
513025360
513025370
513025356
513025364
513025374
513025363
513025373
513025362
513025372
513025361
513025371
513025357
513025365
513025375
513025364
513025374
513025363
513025373
513025362
513025372
513025358
513025366
513025376
513025365
513025375
513025364
513025374
513025363
513025373
513025359
513025367
513025377
513025366
513025376
513025365
513025375
513025364
513025374
513025360
513025368
513025378
513025367
513025377
513025366
513025376
513025365
513025375
513025361
513025369
513025379
513025368
513025378
513025367
513025377
513025366
513025376
513025362
513025370
513025380
513025369
513025379
513025368
513025378
513025367
513025377
513025363
513025371
513025381
513025370
513025380
513025369
513025379
513025368
513025378
513025364
513025372
513025382
513025371
513025381
513025370
513025380
513025369
513025379
513025365
513025373
513025383
513025372
513025382
513025371
513025381
513025370
513025380
513025366
513025374
513025384
513025373
513025383
513025372
513025382
513025371
513025381
513025367
513025375
513025385
513025374
513025384
513025373
513025383
513025372
513025382
513025368
513025376
513025386
513025375
513025385
513025374
513025384
513025373
513025383
513025369
513025377
513025387
513025376
513025386
513025375
513025385
513025374
513025384
513025370
513025378
513025388
513025377
513025387
513025376
513025386
513025375
513025385
513025371
513025379
513025389
513025378
513025388
513025377
513025387
513025376
513025386
513025372
513025380
513025390
513025379
513025389
513025378
513025388
513025377
513025387
513025373
513025381
513025391
513025380
513025390
513025379
</code></pre>
<p>正如你所看到的,它不起作用,我知道我在整个设计中有一个缺陷,但我找不到它,我真的很感谢你的帮助。在</p>
<p><strong>问题摘要</strong>-</p>
<p>我有一个diff list[8,18,7,17,6,16,5,15]程序从获取一个id开始,每次我需要检查下一个id是-id+diff[I]<em>(I=0)</em>
如果(id+diff[i])不是有效的id,我将检查下一个id,即(id+diff[i+1])。在</p>
<p>如果在那个迭代(id+diff[i..n])上没有有效的id,我将<strong>将id增加1</strong>,并检查id+1是否是有效的id,如果不是,我将使用id+diff[i..n]再次检查,直到找到下一个有效的id</p>
<p>在每一次迭代中,我都要检查在上一次迭代中已经检查过的ID(这需要花费大量的时间并且效率低下),我需要避免检查已经检查过的ID,并不断增加ID,直到找到下一个有效的ID为止</p>
<p>现在,如果id=1(并且它是一个有效的id)并且diff=[8,18,7,17,6,16,5,15]。在</p>
<p>第一次迭代看起来像(我用粗体标记id,我可以避免检查)-
第一个-id=1</p>
<p>9,19,8,18,7,17,6,16,2</p>
<p>秒-id=2</p>
<p>10,20,<strong>9</strong>,<strong>19</strong>,<strong>8</strong>,<strong>18</strong>,<strong>7</strong>,<strong>17</strong>,3</p>
<p>第三个-id=3</p>
<p>11,21,<strong>10</strong>,<strong>20</strong>,<strong>9</strong>,<strong>19</strong>,<strong>8</strong>,<strong>18</strong>,4</p>
<p>第四个-id=4</p>
<p>12,<em>22</em>-<strong>没错,下一个有效ID是22!</strong></p>
<p>这花费了我29个请求,而不是-17个,这是一个小例子,我的范围是从最后一个有效id到300-600个id</p>
<p>我拿不到我的代码,以避免检查以前检查过的ID和一个智能和有效的方式。在</p>
<p>谢谢!在</p>