2013-07-12 22 views
6

Ciao come posso far funzionare il crawlspider, sono in grado di accedere ma non succede nulla. Inoltre ho letto il documento scrapy e davvero non capisco le regole da usare per raschiare. Perché non succede nulla dopo "Accesso eseguito con successo. Iniziamo a eseguire la scansione".Utilizzo di scrapy come crawlspider per funzionare con la sessione utente autenticata (loggata)

Avevo anche questa regola alla fine della mia altra istruzione ma la rimuovo perché non è stata nemmeno chiamata perché era dentro il mio altro blocco. quindi l'ho spostato all'inizio del metodo start_request() ma ho ricevuto degli errori, quindi ho rimosso le mie regole.

rules = (
       Rule(extractor,callback='parse_item',follow=True), 
       ) 

il mio codice:

from scrapy.contrib.spiders.init import InitSpider 
from scrapy.http import Request, FormRequest 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders import Rule 
from scrapy.contrib.spiders import CrawlSpider, Rule 

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

from linkedconv.items import LinkedconvItem 

class LinkedPySpider(CrawlSpider): 
    name = 'LinkedPy' 
    allowed_domains = ['linkedin.com'] 
    login_page = 'https://www.linkedin.com/uas/login' 
    # start_urls = ["http://www.linkedin.com/csearch/results?type=companies&keywords=&pplSearchOrigin=GLHD&pageKey=member-home&search=Search#facets=pplSearchOrigin%3DFCTD%26keywords%3D%26search%3DSubmit%26facet_CS%3DC%26facet_I%3D80%26openFacets%3DJO%252CN%252CCS%252CNFR%252CF%252CCCR%252CI"] 
    start_urls = ["http://www.linkedin.com/csearch/results"] 


    def start_requests(self): 
    yield Request(
    url=self.login_page, 
    callback=self.login, 
    dont_filter=True 
    ) 

    # def init_request(self): 
    #"""This function is called before crawling starts.""" 
    #  return Request(url=self.login_page, callback=self.login) 

    def login(self, response): 
    #"""Generate a login request.""" 
    return FormRequest.from_response(response, 
      formdata={'session_key': '[email protected]', 'session_password': 'mypassword'}, 
      callback=self.check_login_response) 

    def check_login_response(self, response): 
    #"""Check the response returned by a login request to see if we aresuccessfully logged in.""" 
    if "Sign Out" in response.body: 
     self.log("\n\n\nSuccessfully logged in. Let's start crawling!\n\n\n") 
     # Now the crawling can begin.. 
     self.log('Hi, this is an item page! %s' % response.url) 

     return 

    else: 
     self.log("\n\n\nFailed, Bad times :(\n\n\n") 
     # Something went wrong, we couldn't log in, so nothing happens. 


    def parse_item(self, response): 
    self.log("\n\n\n We got data! \n\n\n") 
    self.log('Hi, this is an item page! %s' % response.url) 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select('//ol[@id=\'result-set\']/li') 
    items = [] 
    for site in sites: 
     item = LinkedconvItem() 
     item['title'] = site.select('h2/a/text()').extract() 
     item['link'] = site.select('h2/a/@href').extract() 
     items.append(item) 
    return items  

myOutput

C:\Users\ye831c\Documents\Big Data\Scrapy\linkedconv>scrapy crawl LinkedPy 
2013-07-12 13:39:40-0500 [scrapy] INFO: Scrapy 0.16.5 started (bot: linkedconv) 
2013-07-12 13:39:40-0500 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetCon 
sole, CloseSpider, WebService, CoreStats, SpiderState 
2013-07-12 13:39:41-0500 [scrapy] DEBUG: Enabled downloader middlewares: HttpAut 
hMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, De 
faultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMi 
ddleware, ChunkedTransferMiddleware, DownloaderStats 
2013-07-12 13:39:41-0500 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMi 
ddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddle 
ware 
2013-07-12 13:39:41-0500 [scrapy] DEBUG: Enabled item pipelines: 
2013-07-12 13:39:41-0500 [LinkedPy] INFO: Spider opened 
2013-07-12 13:39:41-0500 [LinkedPy] INFO: Crawled 0 pages (at 0 pages/min), scra 
ped 0 items (at 0 items/min) 
2013-07-12 13:39:41-0500 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:602 
3 
2013-07-12 13:39:41-0500 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080 
2013-07-12 13:39:41-0500 [LinkedPy] DEBUG: Crawled (200) <GET https://www.linked 
in.com/uas/login> (referer: None) 
2013-07-12 13:39:42-0500 [LinkedPy] DEBUG: Redirecting (302) to <GET http://www. 
linkedin.com/nhome/> from <POST https://www.linkedin.com/uas/login-submit> 
2013-07-12 13:39:45-0500 [LinkedPy] DEBUG: Crawled (200) <GET http://www.linkedi 
n.com/nhome/> (referer: https://www.linkedin.com/uas/login) 
2013-07-12 13:39:45-0500 [LinkedPy] DEBUG: 


    Successfully logged in. Let's start crawling! 



2013-07-12 13:39:45-0500 [LinkedPy] DEBUG: Hi, this is an item page! http://www. 
linkedin.com/nhome/ 
2013-07-12 13:39:45-0500 [LinkedPy] INFO: Closing spider (finished) 
2013-07-12 13:39:45-0500 [LinkedPy] INFO: Dumping Scrapy stats: 
    {'downloader/request_bytes': 1670, 
    'downloader/request_count': 3, 
    'downloader/request_method_count/GET': 2, 
    'downloader/request_method_count/POST': 1, 
    'downloader/response_bytes': 65218, 
    'downloader/response_count': 3, 
    'downloader/response_status_count/200': 2, 
    'downloader/response_status_count/302': 1, 
    'finish_reason': 'finished', 
    'finish_time': datetime.datetime(2013, 7, 12, 18, 39, 45, 136000), 
    'log_count/DEBUG': 11, 
    'log_count/INFO': 4, 
    'request_depth_max': 1, 
    'response_received_count': 2, 
    'scheduler/dequeued': 3, 
    'scheduler/dequeued/memory': 3, 
    'scheduler/enqueued': 3, 
    'scheduler/enqueued/memory': 3, 
    'start_time': datetime.datetime(2013, 7, 12, 18, 39, 41, 50000)} 
2013-07-12 13:39:45-0500 [LinkedPy] INFO: Spider closed (finished) 

risposta

5

In questo momento, la scansione termina in check_login_response() perché Scrapy non è stato detto di fare qualcosa di più.

  • prima richiesta alla pagina di login utilizzando start_requests(): OK
  • seconda richiesta POST le informazioni di login: OK
  • cui risposta viene analizzato con check_login_response ... e questo è tutto

Infatti check_login_response() non restituisce nulla. Per mantenere la scansione in corso, è necessario tornare Request istanze (che raccontano Scrapy quali pagine per andare a prendere il prossimo, consultare la documentazione Scrapy su callback ragno)

Così, all'interno check_login_response(), è necessario restituire un'istanza Request alla pagina iniziale in seguito, i link che si desidera sottoporre a scansione, probabilmente alcuni degli URL definiti in start_urls.

def check_login_response(self, response): 
     #"""Check the response returned by a login request to see if we aresuccessfully logged in.""" 
     if "Sign Out" in response.body: 
      self.log("\n\n\nSuccessfully logged in. Let's start crawling!\n\n\n") 
      # Now the crawling can begin.. 
      return Request(url='http://linkedin.com/page/containing/links') 

Per impostazione predefinita, se non si imposta un callback per il vostro Request, il ragno chiama il suo metodo parse() (http://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.spider.BaseSpider.parse).

Nel tuo caso, si chiamerà CrawlSpider 's built-in parse() metodo in modo automatico, che applica il Rule s è stato definito per ottenere pagine seguenti.

è necessario definire i tuoi CrawlSpider regole all'interno di un attributo rules di voi ragno di classe, proprio come avete fatto per name, allowed_domain ecc, allo stesso livello.

http://doc.scrapy.org/en/latest/topics/spiders.html#crawlspider-example fornisce regole di esempio. L'idea principale è che tu dica all'estrattore quale tipo di URL assoluto ti interessa all'interno della pagina, usando le espressioni regolari in allow. Se non si imposta allow nel proprio SgmlLinkExtractor, corrisponderà a tutti i collegamenti.

E ogni regola deve avere un callback da utilizzare per questi collegamenti, nel tuo caso parse_item().

Buona fortuna con l'analisi delle pagine di LinkedIn, penso che molto di ciò che è nelle pagine viene generato tramite Javascript e potrebbe non essere contenuto nel contenuto HTML recuperato da Scrapy.

+0

Grazie Paul questo è stato molto utile – Gio

+0

Prego. –