2017-12-12 5 views
0

"https://pagesjaunes.fr"のデータを削るtrypingです。 私はページからデータを掻き集めるために電子メール、アドレスなどScrapy FormRequest.from_response error

ネットワーククロムデバッガで送信されたフォームデータを検索すると、私は束を見ることができますおそらくその場でjavascriptによって生成されるデータです。

enter image description here

、ここでクモのための私のpythonのコードです:

import scrapy 
from scrapy_splash import SplashRequest 
class PagesJaunes(scrapy.Spider): 
    name="pagesjaunes" 
    allowed_domains = [".fr", ".com"] 
    start_urls = ["https://www.pagesjaunes.fr"] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(response, 
     formdata = { 
      "quoiqui": "macon", 
      "ou":"bordeaux" 
     }, 
     callback = self.parse_page2) 

    def parse_page2(self, response): 
     self.logger.info("%s page visited", response.url) 

しかし、それは私に、このエラーを示しています

2017-12-12 13:33:11 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot) 
2017-12-12 13:33:11 [scrapy.utils.log] INFO: Overridden settings: {'EDITOR': '/usr/bin/nano', 'SPIDER_LOADER_WARN_ONLY': True} 
2017-12-12 13:33:11 [scrapy.middleware] INFO: Enabled extensions: 
['scrapy.extensions.corestats.CoreStats', 
'scrapy.extensions.telnet.TelnetConsole', 
'scrapy.extensions.memusage.MemoryUsage', 
'scrapy.extensions.logstats.LogStats'] 
2017-12-12 13:33:11 [scrapy.middleware] INFO: Enabled downloader middlewares: 
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 
'scrapy.downloadermiddlewares.retry.RetryMiddleware', 
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 
'scrapy.downloadermiddlewares.stats.DownloaderStats'] 
2017-12-12 13:33:11 [scrapy.middleware] INFO: Enabled spider middlewares: 
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 
'scrapy.spidermiddlewares.referer.RefererMiddleware', 
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 
'scrapy.spidermiddlewares.depth.DepthMiddleware'] 
2017-12-12 13:33:11 [scrapy.middleware] INFO: Enabled item pipelines: 
[] 
2017-12-12 13:33:11 [scrapy.core.engine] INFO: Spider opened 
2017-12-12 13:33:11 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2017-12-12 13:33:11 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 
2017-12-12 13:33:12 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.pagesjaunes.fr> (referer: None) 
2017-12-12 13:33:13 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'www.pagesjaunes.fr': <POST https://www.pagesjaunes.fr/annuaire/chercherlespros?hp=1> 
2017-12-12 13:33:13 [scrapy.core.engine] INFO: Closing spider (finished) 
2017-12-12 13:33:13 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 216, 
'downloader/request_count': 1, 
'downloader/request_method_count/GET': 1, 
'downloader/response_bytes': 19575, 
'downloader/response_count': 1, 
'downloader/response_status_count/200': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2017, 12, 12, 11, 33, 13, 22520), 
'log_count/DEBUG': 3, 
'log_count/INFO': 7, 
'memusage/max': 52523008, 
'memusage/startup': 52523008, 
'offsite/domains': 1, 
'offsite/filtered': 1, 
'request_depth_max': 1, 
'response_received_count': 1, 
'scheduler/dequeued': 1, 
'scheduler/dequeued/memory': 1, 
'scheduler/enqueued': 1, 
'scheduler/enqueued/memory': 1, 
'start_time': datetime.datetime(2017, 12, 12, 11, 33, 11, 466154)} 

私が間違っているクモを設定AMまたは私は必要なのですかすべてのフォームデータを取得する方法?

+0

チェック 'ネットワークを示している

(403) <GET https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=macon&ou=bordeaux&page=3> 

でサーバーによってブロックされました。 JavaScript(Ajax/XHR)を使用してデータを追加できます。そして、「XHR」では、json – furas

+0

としてデータを取得するために使用されるURLを見つけてください。このWebページに関する質問があると思います。 – furas

+0

実際、このページはajaxを介してデータの一部を取得しています。私がチェックした後、私はデータを取得するために使用することができるURLはありませんまた、私が見ているデータは、プラットフォームのvariabelesに関連しています:クロム... Osの等は何も検索フォームに関連しています。私は、リクエストフォームにネーミングされたデータの大半は、thoughr js scrpitsによって生成されると思います。私はscrapy - スプラッシュを使用してデータを事前に生成しようとしましたが、何とか私はvariabelsのほとんどを見つけることができません。それらのすべてのポスト変数とともに辞書を送ることは本当に必要です。私は2つの瓶だけを使用できますか?それは何とかコードロングですか? –

答えて

1

それはとてもあなたが簡単に私が先頭でstart_urlsにいくつかのURLを追加するstart_requests()を使用

?quoiqui={}&ou={}&page={} 

でフォーマットする文字列を使用して、それを生成することができます

https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=‌​macon&ou=Bordeaux&pa‌​ge=2 

のようなURLを使用しています。

はところで:私は正常に動作する完全なドメインを使用

allowed_domains = ["www.pagesjaunes.fr", "www.pagesjaunes.com"] 

EDIT:私は

import scrapy 

class MySpider(scrapy.Spider): 

    name="myspider" 

    allowed_domains = ["www.pagesjaunes.fr", "www.pagesjaunes.com"] 

    start_urls = [] 

    def start_requests(self): 

     url = 'https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui={}&ou={}&page={}' 

     for page in range(5): 
      yield scrapy.Request(url.format('macon', 'bordeaux', page)) #, callback=self.parse) 


    def parse(self, response): 

     self.logger.info("%s page visited", response.url) 

     print('parse url >>>', response.url) 

     for item in response.css('article'): 
      title = item.css('.denomination-links ::text').extract_first().strip() 
      tel = item.css('.bi-contact-tel strong ::text').extract_first().strip() 

      email = item.css('.hidden-phone.SEL-email a ::attr(data-pjlb)').extract_first() 
      if email: 
       email = email[8:-17] 
       email = base64.b64decode(email) 
       url = response.joinurl(email) 
       yield scrapy.Response(url, callback=parse_email, meta={'title': title, 'tel': tel}) 

      print('title', title, ', tel', tel, 'email:', email) 

      yield {'title': title, 'tel': tel, 'email:': email} 

    def parse_email(self, response): 

     print('parse_email url >>>', response.url) 
     print('parse_email meta >>>', response.meta) 

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

from scrapy.crawler import CrawlerProcess 

c = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/5.0', 
    'FEED_FORMAT': 'csv', 
    'FEED_URI': 'output.csv', 
}) 
c.crawl(MySpider) 
c.start() 
(プロジェクトを作成せず)の例をワーキングコード

に新しい要素を追加します


EDITは: - ブラウザで> XHR`多くの要求(もっとして1000ページ)の後に、それは

enter image description here

+0

ウィスキー!ありがとうございました! –

+0

新しいコードを見る - とボットをブロックするメッセージ( – furas

+0

これはちょっと問題です。私はこれを迂回する可能性のあるものを見つけました。http://sangaline.com/post/advanced-web-scraping-tutorial/ –