python指定生成器迭代的位置开始
PHP中文网
PHP中文网 2017-04-18 09:18:18
0
2
678

一个爬虫程序需要断点恢复的功能, 之前把循环位置作为[a, b, c]保存在json当中

每次进程启动后先从json读取历史位置然后继续遍历

但因为想改成多线程版本, 就试着换成生成器

但这样一来, 每次进程退出重启, 迭代不能记忆位置了

有何良策?

爬去的网页url格式如

-init-page-line

所以我开始是这样的三层循环, (我在学校C/C++为主...我知道这个很不pythonic)


while self.index[0] <= self.limit[0]:
    while self.index[1] <= self.limit[1]:
        while self.index[2] <= self.limit[1]:
           # get page and download someting

里面的index是一个包含历史位置的列表, 每次程序开始会从一个JSON文件读取
然后每次完成一个页面的读取后就会把当前位置更新到JSON文件

因为整体的页面爬取的量十分大, 页面请求次数在千万次级别
目前IO等待占了90%以上的时间, 就像把它改成多线程的
当然也是第一次尝试多线程..

自己的思路是这样的, 首先类维护一个生成器

# 这里的范围是根据网站本身设的
self.generator = ([i, p, l, r]
                    for i in xrange(1, 27)
                    for p in xrange(1, 101)
                    for l in xrange(1, 101)

然后, 比如说JSON里读进来的历史位置, 是一个这样的列表

[5, 5, 5, 5]

再然后.. 思路有点乱了
但应该是每次在发出请求报并等待响应包的时候, 就继续去取得下一个url并发包
尽可能做到并发..

PHP中文网
PHP中文网

认证0级讲师

모든 응답(2)
阿神

무엇을 표현하고 싶은지 잘 모르겠습니다. 하지만 반복자는 다음과 같은 방식으로 시작 위치를 지정할 수 있습니다.

으아악
PHPzhong

아직도 무슨 말씀인지 잘 이해가 안 되지만, 대략적으로 추측해 보겠습니다. 틀렸다면 알려주세요.

다음 형식의 URL을 크롤링하려는 것 같습니다.

으아악

다음과 같은 세 가지 목록이 있습니다.

으아악

그런 다음 각각 indexlimit를 사용하여 현재 위치와 각 목록의 최대 인덱스를 기록합니다.

으아악

그런 다음 모든 URL을 결합합니다.

으아악

위 내용은 제 개인적인 추측입니다. 이 작업을 완료하려면 다음을 수행하는 것이 좋습니다.

으아악
  • itertools.product

  • itertools.dropwhile


내가 답변한 질문: Python-QA

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿