2015-08-10 4 views
0

Я закодировал паук ползать сайт после регистрацииScrapy рекурсивный сайт ползать после авторизации

import scrapy 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import FormRequest, Request 
from scrapy.selector import Selector 
from scrapy.loader import ItemLoader 
from scrapy.contrib.spiders import CrawlSpider,Rule 
from scrapy.contrib.linkextractors import LinkExtractor 

class LoginSpider(scrapy.Spider): 
    name = "login" 
    allowed_domains = ["mydomain.com"] 
    start_urls = ['https://login.mydomain.com/login'] 

    rules = [Rule(LinkExtractor(allow=('//a[contains(text(), "Next")]'), restrict_xpaths=('//a[contains(text(), "Previous")]',)), 'parse_info')] 

    def parse(self, response): 
     return [FormRequest.from_response(response, 
      formdata={"username":"myemail","password":"mypassword"}, 
      callback=self.parse_info, dont_filter=True)] 

    def parse_info(self, response): 
     items = [] 
     for tr in range(1, 5): 
      xpath = "/html/body/table/tbody/tr[%s]/td[1]/text()" % tr 
      td1 = Selector(response=response).xpath(xpath).extract() 
      item = MyItem() 
      item['col1'] = td1 
      items.append(item) 

     return items 

И HTML-

<html> 
    <table> 
     <tbody> 
      <tr><td>Row 1</td></tr> 
      <tr><td>Row 2</td></tr> 
     </tbody> 
    </table> 
    <div><a href="?page=2">Next</a></div> 
    <div><a href="#">Previous</a></div> 
</html> 

Так что паук делает это автоматически войти в систему пользователя с логином страницу и перенаправить на главную страницу с помощью html выше.

Теперь я хочу, чтобы я очистил следующую страницу после первой страницы, используя выше описанный скрипт python.

Я прочитал о документации по Scrapy о реализации правил, но у меня нет успеха, чтобы она работала. Пожалуйста, помогите мне, я застрял на этом больше дня. Спасибо.

ответ

1

I have read about the Scrapy documentation about Rules implementation but I have no success to make it work.

Правило в вашем коде не работает, потому что вы используете стандартный паук (scrapy.Spider), а не CrawlSpider.

Храните стандартный паук и выполняйте разбиение на страницы вручную вместо использования CrawlSpider. Сделайте что-то вроде:

def parse_info(self, response): 
    # items = [] 
    for tr in range(1, 5): 
     xpath = "/html/body/table/tbody/tr[%s]/td[1]/text()" % tr 
     td1 = Selector(response=response).xpath(xpath).extract() 
     item = MyItem() 
     item['col1'] = td1 
     # items.append(item) 
     yield item 
    # return items 

    # If there is a next page, extract href, build request 
    # and send it to server 
    next_page = response.xpath('//a[contains(text(), "Next")]/@href') 
    if next_page: 
     next_page_href = next_page.extract()[0] 
     next_page_url = response.urljoin(next_page_href) 
     request = scrapy.Request(next_page_url, callback=self.parse_info) 
     yield request 
+0

Благодарим Вас за ответ, теперь я получаю эту ошибку, когда я следую за сценарий после того, как я бегу скребок: 'SyntaxError:«возвращение»с аргументом в generator' – PinoyPal

+0

Пожалуйста, попробуйте использовать 'yield item' вместо создания списка и возврата этого. Я отредактировал свой ответ с этими изменениями. –

+0

Отлично! Ты просто спас мне день. Благодаря :) – PinoyPal

Смежные вопросы