2013-05-31 3 views
1

я пытаюсь лом результата следующей страницы:Scrapy Искатель не может сканировать данные из нескольких страниц

http://www.peekyou.com/work/autodesk/page=1

со страницей = 1,2,3,4 ... так далее, как в результаты. Поэтому я получаю файл php для запуска поискового робота, который запускает его для разных номеров страниц. Код (для одной страницы) выглядит следующим образом:

`import sys 
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from scrapy.http import Request 
#from scrapy.crawler import CrawlerProcess 

class DmozSpider(BaseSpider): 
name = "peekyou_crawler" 

start_urls = ["http://www.peekyou.com/work/autodesk/page=1"]; 

def parse(self, response): 

    hxs = HtmlXPathSelector(response) 

    discovery = hxs.select('//div[@class="nextPage"]/table/tr[2]/td/a[contains(@title,"Next")]') 
    print len(discovery) 

    print "Starting the actual file" 
    items = hxs.select('//div[@class="resultCell"]') 
    count = 0 
    for newsItem in items: 
     print newsItem 

     url=newsItem.select('h2/a/@href').extract() 
     name = newsItem.select('h2/a/span/text()').extract() 
     count = count + 1 
     print count 
     print url[0] 
     print name[0] 

     print "\n" 

` страницы результатов Autodesk имеет 18 страниц. Когда я запускаю код для обхода всех страниц, искатель получает данные только со страницы 2, а не на всех страницах. Аналогичным образом, я изменил название компании, чтобы быть чем-то другим. Опять же, он обрывает некоторые страницы и не отдыхает. Я получаю http-ответ 200 на каждой странице. Кроме того, даже я продолжаю запускать его снова, он продолжает ломать одни и те же страницы, но не всегда. Любая идея о том, что может быть ошибкой в ​​моем подходе или что-то мне не хватает?

Заранее спасибо.

ответ

1

Вы можете добавить несколько адресов:

start_urls = [ 
    "http://www.peekyou.com/work/autodesk/page=1", 
    "http://www.peekyou.com/work/autodesk/page=2", 
    "http://www.peekyou.com/work/autodesk/page=3" 
]; 

Вы можете создать несколько адресов:

start_urls = [ 
    "http://www.peekyou.com/work/autodesk/page=%d" % i for i in xrange(18) 
]; 

Я думаю, вы должны прочитать о start_requests() и как генерировать следующий URL. Но я не могу вам помочь, потому что я не использую Scrapy. Я все еще использую чистый python (и pyQuery) для создания простых сканеров;)

PS. Иногда серверы проверяют ваш UserAgent, IP, как быстро вы просматриваете следующую страницу и перестаете отправлять вам страницы.

+0

Я попытался посмотреть исходный код этих страниц и посмотреть, как результаты загружаются позже и продолжают показывать «загрузка». Подобное происходит, когда мы пытаемся увидеть исходный код. Он показывает «загрузочный малый» и загружается только после некоторого времени. Таким образом, мой искатель не смог бы найти какие-либо данные для сканирования по времени, когда он начнет очищать. Любое решение? – Aryabhatt

+0

Если результаты будут загружены позже, для загрузки этого файла должен быть некоторый javascript с помощью ajax - вы можете искать слова «ajax», «post», «get» или «http: //» в javascript для поиска URL-адресов загруженных данных.Я также использую firefox + firebug, чтобы узнать, какие URL-адреса вызывается браузером - он даже быстрее, чем поиск в javascript. Если у вас есть URL-адрес, вы можете проверить его и использовать для получения данных напрямую. – furas

1

Я дам вам отправную точку.

Страница, которую вы пытаетесь выполнить, загружается через AJAX, это проблема с помощью scrapy - она ​​не может справиться с динамической загрузкой страницы с помощью запросов AHXX XHR. Для получения дополнительной информации см:

Использование инструментов разработчика браузера, вы можете заметить, что есть запрос исходящего POST происходит после загрузки страницы. Это будет http://www.peekyou.com/work/autodesk/web_results/web_tag_search_checker.php.

Таким образом, имитируя это в Scrapy должно помочь вам сканировать необходимые данные:

from scrapy.http import FormRequest 
from scrapy.item import Item, Field 
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 


class DmozItem(Item): 
    name = Field() 
    link = Field() 


class DmozSpider(BaseSpider): 
    name = "peekyou_crawler" 

    start_urls = start_urls = [ 
     "http://www.peekyou.com/work/autodesk/page=%d" % i for i in xrange(18) 
    ] 

    def parse(self, response): 
     yield FormRequest(url="http://www.peekyou.com/work/autodesk/web_results/web_tag_search_checker.php", 
          formdata={'id': 'search_work_a10362ede5ed8ed5ff1191321978f12a', 
            '_': ''}, 
          method="POST", 
          callback=self.after_post) 

    def after_post(self, response): 
     hxs = HtmlXPathSelector(response) 

     persons = hxs.select("//div[@class='resultCell']") 

     for person in persons: 
      item = DmozItem() 
      item['name'] = person.select('.//h2/a/span/text()').extract()[0].strip() 
      item['link'] = person.select('.//h2/a/@href').extract()[0].strip() 
      yield item 

Он работает, но сбрасывает только первую страницу. Я оставлю это для вас, чтобы понять, как вы можете получить другие результаты.

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

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