2017-01-14 7 views
1

i scrapy verwendet kürzlich zu kratzen Zoom i testen dann das unten stehende URLwie mit escaped_fragment umgehen scrapy mit

http://subscriber.zoominfo.com/zoominfo/#!search/profile/person?personId=521850874&targetid=profile 

aber einige, wie in Terminal, verändert es wie dieses

[scrapy] DEBUG: Crawled (200) <GET http://subscriber.zoominfo.com/zoominfo/?_escaped_fragment_=search%2Fprofile%2Fperson%3FpersonId%3D521850874%26targetid%3Dprofile> 

Ich habe hinzugefügt AJAXCRAWL_ENABLED = True in setting.py aber die URL hat immer noch escaped_fragment. Ich bezweifle, dass ich nicht die richtige Seite eingegeben habe, die ich will.

Der spider.py Code ist unten:

#!/usr/bin/env python 
# -*- coding:utf-8 -*- 
import scrapy 
from scrapy.selector import Selector 
from scrapy.http import Request, FormRequest 
from tutorial.items import TutorialItem 
from scrapy.spiders.init import InitSpider 


class LoginSpider(InitSpider): 
    name = 'zoominfo' 
    login_page = 'https://www.zoominfo.com/login' 
    start_urls = [ 
    'http://subscriber.zoominfo.com/zoominfo/#!search/profile/person?personId=521850874&targetid=profile', 
    ] 
    headers = { 
     "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
     "Accept-Encoding":"gzip, deflate, br", 
     "Accept-Language":"en-US,en;q=0.5", 
     "Connectionc":"keep-alive", 
     "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0", 
    } 
    def init_request(self): 
     return Request(url=self.login_page, callback=self.login) 

    def login(self, response): 
     print "Preparing Login" 
     return FormRequest.from_response(
      response, 
      headers=self.headers, 
      formdata={ 
      'task':'save', 
      'redirect':'http://subscriber.zoominfo.com/zoominfo/#!search/profile/person?personId=521850874&targetid=profile', 
      'username': username, 
      'password': password 
     }, 
      callback=self.after_login, 
      dont_filter = True, 
     ) 

    def after_login(self, response): 
     if "authentication failed" in response.body: 
      self.log("Login unsuccessful") 
     else: 
      self.log(":Login Successfully") 
      self.initialized() 
      return Request(url='http://subscriber.zoominfo.com/zoominfo/', callback=self.parse) 

    def parse(self, response): 
     base_url = 'http://subscriber.zoominfo.com/zoominfo/#!search/profile/person?personId=521850874&targetid=profile' 
     sel = Selector(response) 
     item = TutorialItem() 
     divs = sel.xpath("//div[3]//p").extract() 
     item['title'] = sel.xpath("//div[3]") 
     print divs 
     request = Request(base_url, callback=self.parse) 
     yield request 

dank mir jemand einen Tip geben könnte.

Antwort

1

#! == _escaped_fragment_

_escaped_fragment_ ist hässlich url und wird meist präsentiert Web-Crawler, während echte Benutzer die hübsche #! Version erhalten genannt. In beiden Fällen meinen beide dasselbe und es sollte funktional nichts anderes geben.

Siehe google's ajax specification for this subject.

+0

so meinen Sie, dass ich schon die richtige Seite eingegeben haben, was ich will? Aber warum die URL im Terminal passiert ist anders als die, die ich will, einschließlich der '/' wird in '% 2F', und auch die '?' wird zum '% 3F'. –

+0

@PeterTsung, weil alle sensiblen Zeichen nach '#!' Maskiert werden, da sie nicht Teil der URL sind. Mit anderen Worten, das sind Bits, die nicht für Ihren Browser gedacht sind, sondern für den Webseiten-Server. – Granitosaurus

+0

Sie meinen also, dass ich bereits die richtige Seite eingegeben habe, die ich möchte, obwohl die URL im Terminal sich von der im Code unterscheidet? –