2016-02-02 4 views
1

Я запрограммировал паука в scrapy для извлечения данных с веб-сайта. У меня есть список ссылок с подобными структурированными html-таблицами, и до сих пор извлечение этих работ было прекрасным. Теперь проблема в том, что некоторые из этих таблиц работают на нескольких страницах, т. Е. Если набор данных длиннее 30 строк, он разделяется. В большинстве таблиц есть только одна страница, но некоторые из них значительно дольше, чем до 70 следующих страниц. Следующая страница достигается нажатием кнопки «Следующий лист» в форме html-формы. Я хочу, чтобы паук переходил на каждую из таблиц, извлекал данные с первой страницы, затем переходил ко второй, третьей странице и т. Д., Пока не будет больше «следующей» кнопки, а затем продолжите со следующего исходного URL-адреса.Нажатие кнопки формы html на следующую страницу в scrapy/python

Я понимаю, что мне нужна, вероятно, команда form_request, но я новичок в этих вещах, и все примеры, которые я нашел в Интернете, были структурированы несколько иначе, поэтому нам будет очень благодарна помощь.

Это мой код, который извлекает первую страницу каждой таблицы.

from scrapy.spiders import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from example.items import exitem 
from scrapy.http import FormRequest 

class MySpider(BaseSpider): 
    name = "example" 

    with open('linklist.txt') as f: 
     start_urls = f.readlines() 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     main = hxs.xpath("/html/body/table[2]/tr/td[2]/table/tr/td/table[1]/tr[1]/td[1]/table") 
     titles = hxs.xpath("/html/body/table[2]/tr/td[2]/table/tr/td/table[1]/tr[2]/td/table/tr") 
     items = [] 
     for titles in titles: 
      item = exitem() 
      item["pid"] = titles.xpath("td[2]/font/text()").extract() 
      item["famname"] = titles.xpath("td[3]/font/b/text()").extract() 
      item["firstname"] = titles.xpath("td[4]/font/text()").extract() 
      item["sex"] = titles.xpath("td[5]/font/text()").extract() 
      item["age"] = titles.xpath("td[6]/font/text()").extract() 
      item["famstat"] = titles.xpath("td[7]/font/text()").extract() 
      item["res"] = titles.xpath("td[8]/font/text()").extract() 
      item["nation"] = titles.xpath("td[9]/font/text()").extract() 
      item["state"] = titles.xpath("td[10]/font/text()").extract() 
      item["job"] = titles.xpath("td[11]/font/text()").extract() 
     return(items) 

Это форма на сайте:

<form action="http://example.com/listen.php" method="get"> 
    <input type="submit" value="next sheet" name=""> 
    <input type="hidden" value="1234567" name="ArchivIdent"> 
    <input type="hidden" value="31" name="start"> 
</form> 

"Старт" значение 31 для второй страницы, 61 для третьей страницы, 91 для четвертого и т.д.

ответ

1
from selenium import web driver 
driver = webdriver.Firefox() 
driver.get("your page") 
try: 
    driver.findElement(By.xpath("//*[@type='submit'][@value='next']")).click() 
except: 
    pass 
continue with your program 

Как только кнопка не будет найдена, она выйдет из попытки. Затем продолжите свою программу.

Надеюсь, это поможет.

+0

Спасибо. Где я должен был бы поместить эти строки в свой код? Я попытался вставить его, и я получил синтаксическую ошибку для 'driver = new FirefoxDriver()' – Alex

+0

http://selenium-python.readthedocs.org/getting-started.html –

+0

Я исправил синтаксис. См. Ссылку выше для документа selenium python. –

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