2017-12-18 12 views
0

私はウェブスクラップに初心者です。私は治療のフレームワークを学び始めました。スクレイピーフレームワークでウェブページをスクラップする方法は?

私はの治療の基本チュートリアルをカバーしました。今、私はthisページをスクラップしようとしています。 thisチュートリアルを1として

、全体のhtmlページを取得するためには、1つのコード以下の記述する必要があります含まれています

import scrapy 


class ClothesSpider(scrapy.Spider): 
    name = "clothes" 

    start_urls = [ 
     'https://www.chumbak.com/women-apparel/GY1/c/', 
    ] 

    def parse(self, response): 
     filename = 'clothes.html' 
     with open(filename, 'wb') as f: 
      f.write(response.body) 

このコードの実行罰金を。しかし、私は期待された結果を得ていません。

私はclothes.htmlを開くと、HTMLデータは、私は、ブラウザから調べないときと同じではありません。多くのものはclothes.htmlにありません。

ここで何が問題になるのか分かりませんでした。私を助けてください。 ご協力いただければ幸いです。

ありがとうございました。

+3

ブラウザの検査ツールにはHTMLが表示されません。その時点で存在するDOMを表示します。おそらく、ページはJavaScriptによって変更されます。ソースの表示(FirefoxまたはChromeではCtrl + U)を使用すると、同じようにscrapyが表示されます。 – Thomas

+1

今日は多くのページが動的であり、自分自身をレンダリングする傾向があります。ヘッドレスブラウザの使用を検討してください。 – AndreyF

+0

@Thomas、ありがとうございます。 scrapyでJSに修正された結果を得る方法はありますか? – Amit

答えて

1

このページはJavaScriptを使用してページにデータを格納します。

サーバー(タブネットワーク、フィルターXHR)からこのデータを取得するためにはJavaScriptを使用したURLを確認できクローム/ FirefoxでDevToolを使用して

そして、あなたはあまりにもデータを取得しようとすることができます。

コードは、JSONデータで10ページのURLを生成し、それらをダウンロードし、別々のファイルに保存し、フルURLをイメージに生成し、Scrapyをサブフォルダfullにダウンロードします。 Scrapyoutput.jsonすべてyieldダウンロードした画像に関するデータも保存してください。

#!/usr/bin/env python3 

import scrapy 
#from scrapy.commands.view import open_in_browser 
import json 

class MySpider(scrapy.Spider): 

    name = 'myspider' 

    #allowed_domains = [] 

    #start_urls = ['https://www.chumbak.com/women-apparel/GY1/c/'] 

    #start_urls = [ 
    # 'https://api-cdn.chumbak.com/v1/category/474/products/?count_per_page=24&page=1', 
    # 'https://api-cdn.chumbak.com/v1/category/474/products/?count_per_page=24&page=2', 
    # 'https://api-cdn.chumbak.com/v1/category/474/products/?count_per_page=24&page=3', 
    #] 

    def start_requests(self): 
     pages = 10 
     url_template = 'https://api-cdn.chumbak.com/v1/category/474/products/?count_per_page=24&page={}' 

     for page in range(1, pages+1): 
      url = url_template.format(page) 
      yield scrapy.Request(url) 

    def parse(self, response): 
     print('url:', response.url) 

     #open_in_browser(response) 

     # get page number 
     page_number = response.url.strip('=')[-1] 

     # save JSON in separated file 
     filename = 'page-{}.json'.format(page_number) 
     with open(filename, 'wb') as f: 
      f.write(response.body) 

     # convert JSON into Python's dictionary 
     data = json.loads(response.text) 

     # get urls for images 
     for product in data['products']: 
      #print('title:', product['title']) 
      #print('url:', product['url']) 
      #print('image_url:', product['image_url']) 

      # create full url to image 
      image_url = 'https://media.chumbak.com/media/catalog/product/small_image/260x455' + product['image_url'] 
      # send it to scrapy and it will download it 
      yield {'image_urls': [image_url]} 


     # download files 
     #for href in response.css('img::attr(href)').extract(): 
     # url = response.urljoin(src) 
     # yield {'file_urls': [url]} 

     # download images and convert to JPG 
     #for src in response.css('img::attr(src)').extract(): 
     # url = response.urljoin(src) 
     # yield {'image_urls': [url]} 

# --- it runs without project and saves in `output.csv` --- 

from scrapy.crawler import CrawlerProcess 

c = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/5.0', 

    # save in CSV or JSON 
    'FEED_FORMAT': 'json',  # 'cvs', 'json', 'xml' 
    'FEED_URI': 'output.json', # 'output.cvs', 'output.json', 'output.xml' 

    # download files to `FILES_STORE/full` 
    # it needs `yield {'file_urls': [url]}` in `parse()` 
    #'ITEM_PIPELINES': {'scrapy.pipelines.files.FilesPipeline': 1}, 
    #'FILES_STORE': '/path/to/valid/dir', 

    # download images and convert to JPG 
    # it needs `yield {'image_urls': [url]}` in `parse()` 
    #'ITEM_PIPELINES': {'scrapy.pipelines.images.ImagesPipeline': 1}, 
    #'IMAGES_STORE': '/path/to/valid/dir', 
    'ITEM_PIPELINES': {'scrapy.pipelines.images.ImagesPipeline': 1}, 
    'IMAGES_STORE': '.', 
}) 
c.crawl(MySpider) 
c.start() 
関連する問題