2017-12-06 34 views
0

Scrapy Spider를 사용하여 텍스트 파일에서 URL 목록을 크롤링합니다. 나는 파이썬과 스콥에 대해 다소 새로운 편이다. 나는이 일을 끝내기 위해 날개를 달기 만하면된다.Scrapy Spider : n 번째 줄부터 url 목록을 크롤링

URL을 내 목록은 오히려 큰, 그래서 이것은 내가 그것을 구현하는 방법입니다 : 내가 지금 무엇을 구문 분석하고 있지 않다

from scrapy.spider import BaseSpider 
from scrapy.http.request import Request 
import time 

class MySpider(BaseSpider): 
    name = "example" 
    allowed_domains = ["example.com"] 


    def __init__(self, filename=None, delay=5, start_line = 0): 
     self.currentline = 0 
     self.download_delay = int(delay) 
     self.filename = filename 
     self.start_line = int(start_line) 



    def start_requests(self): 
     with open(self.filename, 'r') as f: 
      for url in f.readlines(): 
       self.currentline +=1 

       if self.currentline < self.start_line: 
        continue 
       else: 
        print(self.currentline) 
        yield Request(url.strip(), self.parse) 

    def parse(self, response): 
     logfilename = 'log' 
     with open(logfilename, 'a') as f: 
      f.write('Crawled line ' + str(self.currentline) + ' of ' + self.filename + ': ' + response.url + '\n') 

, 난 그냥 그것을 로깅, 나중에 걱정 것을 지금. 나는 그것을 전화

는 말 :의 URL 목록이 상당히 크다고 할 수있다

scrapy runspider myfolder\kwdSpider.py -a filename=myfolder\urls.txt -a delay=10 -a start_line=124 

때문에 내가 지정된 start_line에서 크롤링 다시 시작하는 옵션을 구현 (및 yield Request() 사용). 실제로는 모든 것이 잘 작동합니다 :

E:\Python27>scrapy runspider mysite\kwdSpider.py -a filename=example\urls.txt -a delay=8 -a start_line=124 
E:\Python27\example\kwdSpider.py:5: ScrapyDeprecationWarning: kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others) 
    class MySpider(BaseSpider): 
2017-12-06 12:27:35+0100 [scrapy] INFO: Scrapy 0.25.1 started (bot: scrapybot) 
2017-12-06 12:27:35+0100 [scrapy] INFO: Optional features available: ssl, http11 
2017-12-06 12:27:35+0100 [scrapy] INFO: Overridden settings: {} 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled item pipelines: 
2017-12-06 12:27:35+0100 [example] INFO: Spider opened 
2017-12-06 12:27:35+0100 [example] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2017-12-06 12:27:35+0100 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024 
2017-12-06 12:27:35+0100 [scrapy] DEBUG: Web service listening on 127.0.0.1:6081 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
2017-12-06 12:27:38+0100 [example] DEBUG: Crawled (200) <GET https://www.example.com/139th url> (referer: None) 
140 
2017-12-06 12:27:47+0100 [example] DEBUG: Crawled (200) <GET https://www.example.com/140th url> (referer: None) 
141 

처음 12 개 정도의 URL을 건너 뛰는 방법을보십시오. 분명히 스파이더가 어떻게 작동하는지 분명히 이해하지 못하고 있습니다. start_requests 루틴이 txt 파일을 통해 계산을 완료하기 전에 초기화되지 않았습니까? (이 방법은 제가 구현할 수있는 유일한 방법입니다)?

보너스 질문 -이 공지 사항은 무엇입니까?

@kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others) 
    class MySpider(BaseSpider): 

감사합니다.

+0

결국 건너 뛴 URL로 돌아갑니다. 나는 선형 적으로 작동하지 않는다고 생각합니다. 어느 한 도메인을 공격 할 비율을 제한합니다. 그게 당신 문제일까요? – Phil

+0

필자는 그렇게 생각하지 않는다. 적어도 로그에 기록되지 않으며, 콘솔 출력에 표시되지 않는다. 로그와 콘솔 모두가 계속 진행됩니다 ( 줄 140, 141, 142, 143 등). 건너 뛰었던 줄에는 결코 돌아 가지 않습니다. 나는 거미가 그 처음 12 개의 선을 얻지 않고있다라고 말할 것이다. – Bodd

+0

시작 줄이 다른 번호 (예 : 140) 인 경우 차이가 있습니까? 그냥 건너 뛰는 URL이나 파일 형식의 문제에는 문제가 없다는 것을 배제하려고합니다. 어쩌면 print 문에'url.strip()'을 추가하여 현실을 반영해야하는지 보여줄 수 있습니다. – Phil

답변

0

기본 문제로 조사가 진행되는 동안 보너스 질문에 답변하겠습니다. 경고에 관한

적어도 그 문제를 해결해야

from scrapy.spider import Spider 
from scrapy.http.request import Request 
import time 

class MySpider(Spider): 

:

@kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others) 
class MySpider(BaseSpider): 

단어에 메시지를 다음은,에 코드를 변경합니다.