2016-07-22 2 views
1

Я хочу спросить, как о (сделать ползать), нажав кнопку Далее (изменение номер страницы сайта) (то же ползет более до конца номера страницы) от this siteнажатие кнопки на веб-сайте с помощью Scrapy

Я попробуйте объединить царапины с селеном, но все еще ошибка и говорит "line 22 self.driver = webdriver.Firefox() ^ IndentationError: expected an indented block"

Я не знаю, почему это происходит, я думаю, что код такой же хороший. Любой может решить эту проблему?

Это мой источник:

from selenium import webdriver 
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from now.items import NowItem 
class MySpider(BaseSpider): 
name = "nowhere" 
allowed_domains = ["n0where.net"] 
start_urls = ["https://n0where.net/"] 

def parse(self, response): 
    for article in response.css('.loop-panel'): 
     item = NowItem() 
     item['title'] = article.css('.article-title::text').extract_first() 
     item['link'] = article.css('.loop-panel>a::attr(href)').extract_first() 
     item['body'] ='' .join(article.css('.excerpt p::text').extract()).strip() 
     #item['date'] = article.css('[itemprop="datePublished"]::attr(content)').extract_first() 
     yield item 

def __init__(self): 
    self.driver = webdriver.Firefox() 

    def parse2(self, response): 
    self.driver.get(response.url) 

    while True: 
     next = self.driver.find_element_by_xpath('/html/body/div[4]/div[3]/div/div/div/div/div[1]/div/div[6]/div/a[8]/span') 

     try: 
      next.click() 

      # get the data and write it to scrapy items 
     except: 
      break 

    self.driver.close()` 

Это мой захват моего партнера программы: capture program

+0

вашего кода underindented, все после строки 5 должно быть отступом 4 пробела, потому что код принадлежит к классу. – Granitosaurus

+0

ah, python, имеющий правила об этом?-_- Я не знаю об этом, прежде чем это кодирование с использованием java или C#, и у обоих из них нет таких правил, похоже, что это так по-другому ... btw его весь мой код выглядит нормально, может быть запущен. но после того, как я добавлю строку 19 и более ее ошибку, и я не знаю, почему mate (после драйвера mozilla) ... – beboy

+0

Да, отступы в вопросах python, вот как вы определяете области действия, так как нет фигурных скобок и т. д. Честно говоря, вы должны сделать правильное оформление на любом языке программирования, фигурные скобки или нет ... – Granitosaurus

ответ

1

Это ошибка отступы. Посмотрите строки рядом с ошибкой:

def parse2(self, response): 
    self.driver.get(response.url) 

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

В зависимости от того, что вы хотите сделать, возможны две ошибки. Либо добавить отступ ко второму:

def parse2(self, response): 
     self.driver.get(response.url) 

Или переместить `функцию parse2 function out of theINIT:

def parse2(self, response): 
    self.driver.get(response.url) 

def __init__(self): 
    self.driver = webdriver.Firefox() 

    # etc. 
+0

его кажется хорошим приятелем после того, как я переписал эту строку, как вы, но почему вдруг не сделал ползучий и не закрыл мой Mozilla firefox, любой раствор? – beboy

+0

@beboy ваш webdriver закрывается, потому что он на самом деле не привыкает, проверьте мой ответ для меня, почему это происходит. – Granitosaurus

2

Игнорирование синтаксиса и отступы ошибок у вас есть проблемы с вашим кодом логики в целом ,

Что вы делаете, это создать webdriver и никогда не использовать его. Ваш паук здесь:

  1. Создайте объект webdriver.
  2. Запланируйте запрос на каждый URL-адрес в self.start_urls, в вашем случае это только один.
  3. Качайте, сделать Response объект и передать его в self.parse()
  4. Ваш метод синтаксического анализа, кажется, найти некоторые XPaths и делает некоторые вещи, так Scrapy урожаи вам некоторые вещи, которые были найдены при наличии
  5. Совершено

Ваш parse2 так и не был вызван, поэтому ваш селен-webdriver никогда не использовался.

Поскольку вы не используете scrapy для загрузки чего-либо в этом случае, вы можете просто переопределить start_requests() (< - вот где ваш паук начинает) метод вашего паука, чтобы сделать всю логику.

Что-то вроде:

from selenium import webdriver 
import scrapy 
from scrapy import Selector 


class MySpider(scrapy.Spider): 
    name = "nowhere" 
    allowed_domains = ["n0where.net"] 
    start_url = "https://n0where.net/" 

    def start_requests(self): 
     driver = webdriver.Firefox() 
     driver.get(self.start_url) 
     while True: 
      next_url = driver.find_element_by_xpath(
       '/html/body/div[4]/div[3]/div/div/div/div/div[1]/div/div[6]/div/a[8]/span') 
      try: 
       # parse the body your webdriver has 
       self.parse(driver.page_source) 
       # click the button to go to next page 
       next_url.click() 
      except: 
       break 
     driver.close() 

    def parse(self, body): 
     # create Selector from html string 
     sel = Selector(text=body) 
     # parse it 
     for article in sel.css('.loop-panel'): 
      item = dict() 
      item['title'] = article.css('.article-title::text').extract_first() 
      item['link'] = article.css('.loop-panel>a::attr(href)').extract_first() 
      item['body'] = ''.join(article.css('.excerpt p::text').extract()).strip() 
      # item['date'] = article.css('[itemprop="datePublished"]::attr(content)').extract_first() 
      yield item 
+0

спасибо, я попробую это завтра, прямо сейчас я должен подготовить igredients для подаренного i'am новичок по использованию python, его так отличается от java или C# ... так что позиционирование числа на программировании на python, список код его дает влияние на логическое кодирование .. – beboy

+0

эй мат его успех, основная проблема заключается в firefox v47 он не совместим с моей версией селена, поэтому я делаю downgrade firefox, Кстати вы знаете, почему эта ошибка произошла? TypeError: 'NoneType' объект не является итерируемым ", что означает помощник? В случае, я хочу сделать перерыв до последней страницы ... – beboy

+0

Что касается ошибки, это означает, что она говорит прямо там. Ваш код пытается выполнить итерацию через значение «Нет». Я предполагаю, что это будет этот бит 'для статьи в sel.css ('. Loop-panel')' вам нужно проверить, есть ли какие-то статьи, если нет тогда разрыва процесса, то есть 'if not sel.css ('.loop-panel'): return' – Granitosaurus

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