2017-12-08 8 views
0

(매우) 새로운 나는 더 많은 페이지에서 데이터를 긁어 노력했습니다/Scrapy와 동일한 웹 사이트의 섹션웹 사이트에서 여러 페이지를 긁어 모으는 방법? 파이썬과 일반</p> <p>에서 프로그래밍

내 코드가 작동하지만, 읽을이고 실용적이지

import scrapy 

class SomeSpider(scrapy.Spider): 
name = 'some' 
allowed_domains = ['https://example.com'] 
start_urls = [ 
'https://example.com/Python/?k=books&p=1', 
'https://example.com/Python/?k=books&p=2', 
'https://example.com/Python/?k=books&p=3', 
'https://example.com/Python/?k=tutorials&p=1', 
'https://example.com/Python/?k=tutorials&p=2', 
'https://example.com/Python/?k=tutorials&p=3', 
] 

def parse(self, response): 
response.selector.remove_namespaces() 

info1 = response.css("scrapedinfo1").extract() 
info2 = response.css("scrapedinfo2").extract() 

for item in zip(scrapedinfo1, scrapedinfo2): 
    scraped_info = { 
     'scrapedinfo1': item[0], 
     'scrapedinfo2': item[1]} 

     yield scraped_info 

어떻게 향상시킬 수 있습니까?

나는

나는 동안, Scrapy 모든 카테고리와 페이지를 통해 그 일을 할 수있을 것이라고 그래서

categories = [books, tutorials, a, b, c, d, e, f] 
in a range(1,3) 

같은 뭔가가 필요 카테고리와 페이지의 일정 금액 내에서 검색하고 싶습니다 편집 및 다른 웹 사이트

어떤 아이디어가에 적응하기 쉬운 것을 환영

내가 시도 무엇

:

01 23,516,
categories = ["books", "tutorials"] 
base = "https://example.com/Python/?k={category}&p={index}" 

def url_generator(): 
    for category, index in itertools.product(categories, range(1, 4)): 
     yield base.format(category=category, index=index) 

그러나 Scrapy 당신은 yield Request(url)를 사용하여 시작에 URL을 생성하는 방법 start_requests()을 사용할 수 있습니다

[scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), 
scraped 0 items (at 0 items/min) 
+0

사용하는 버튼입니다'{}'제대로 SO에 코드를 포맷합니다. – furas

+0

'url_generator()'는 클래스 내부의 메소드이므로'self (self)'-'def url_generator (self) :'가 필요합니다. 카테고리'product (self.categories', ...)와 동일합니다. BTW :'base.format (category = category, index = index) '로 얻은 것을 보려면'print()'를 사용하십시오. – furas

+0

치료법은 [start_requests] (https://doc.scrapy.org/en/latest/) 방법을 가지고 있습니다. topics/spiders.html # scrapy.spiders.Spider.start_requests) 시작시 URL을 생성합니다. 그리고'url'을 가진 문자열뿐만 아니라 Request (url = ...)도 얻어야합니다. – furas

답변

0

를 반환합니다.

동의어 : 나중에 parse()yield Request(url)을 사용하여 새 URL을 추가 할 수도 있습니다.

나는 거미를 테스트하기 위해 만들어진 toscrape.com 포털을 사용합니다.

import scrapy 

class MySpider(scrapy.Spider): 

    name = 'myspider' 

    allowed_domains = ['http://quotes.toqoute.com'] 

    #start_urls = [] 

    tags = ['love', 'inspirational', 'life', 'humor', 'books', 'reading'] 
    pages = 3 
    url_template = 'http://quotes.toscrape.com/tag/{}/page/{}' 

    def start_requests(self): 

     for tag in self.tags: 
      for page in range(self.pages): 
       url = self.url_template.format(tag, page) 
       yield scrapy.Request(url) 


    def parse(self, response): 
     # test if method was executed 
     print('url:', response.url) 

# --- run it without project --- 

from scrapy.crawler import CrawlerProcess 

#c = CrawlerProcess({ 
# 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
# 'FEED_FORMAT': 'csv', 
# 'FEED_URI': 'output.csv', 
#} 

c = CrawlerProcess() 
c.crawl(MySpider) 
c.start() 
1

해결 start_requests()에 감사 yield scrapy.Request()

이 여기에 코드를

import scrapy 
import itertools 


class SomeSpider(scrapy.Spider): 
    name = 'somespider' 
    allowed_domains = ['example.com'] 

    def start_requests(self): 
     categories = ["books", "tutorials"] 
     base = "https://example.com/Python/?k={category}&p={index}" 

     for category, index in itertools.product(categories, range(1, 4)): 
      yield scrapy.Request(base.format(category=category, index=index)) 

    def parse(self, response): 
     response.selector.remove_namespaces() 

     info1 = response.css("scrapedinfo1").extract() 
     info2 = response.css("scrapedinfo2").extract() 

     for item in zip(info1, info2): 
      scraped_info = { 
       'scrapedinfo1': item[0], 
       'scrapedinfo2': item[1], 
      } 

      yield scraped_info 
+1

맞습니다! 나는 이중 점검없이 그것을 썼다! :) 내 이전 의견을 제거하므로 – Rawhide

+0

:) – furas