2017-12-08 18 views
0

のPythonに(非常に)新しいプログラミング一般ウェブサイトから複数のページをスクラップする方法は?

に私は私のコードは動作しますが、それが読めないと

実用的ではありませんScrapy

と同じウェブサイトの複数のページ/セクションからデータをこすりしようとしてきました

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:容易である任意のアイデアは、私が試してみました何

歓迎されている

を編集して、他のウェブサイトに適応します

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 - ' def url_generator(self): 'が必要です。' category(product) 'self.categories'と同じです。ところで、 '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を生成します。そして 'Request(url = ...)'を返さなければなりません。文字列 'url'だけでなく、 – furas

答えて

0

を返します。

続き:parse()の後で、yield Request(url)を使用して新しいURLを追加することもできます。

私は、スパイダーをテストするために作成されたポータルtoscrape.comを使用しています。 start_requests()yield scrapy.Request()

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

解決おかげここコード

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

関連する問題