Выскабливание из URL, которые содержат регулярное выражение - PullRequest
0 голосов
/ 28 июня 2011

Я пытался собрать данные с сайта: http://uk.ratemyteachers.com/. Я хочу получить информацию от определенного числа учителей, которым я не знаю имя с сайта.

У каждого учителя есть страница на веб-сайте, которая следует регулярному шаблону.Так, например, этот учитель Lois Bank хранится по адресу: http://uk.ratemyteachers.com/lois-banks/184618-t. Таким образом, шаблон - это имя учителя, косая черта, число, тире t.

До того, как я попытался использовать CrawlSpider для сканирования с домашней страницы с помощью регулярных выражений, но это не сработало, потому что страницы, к которым я пытаюсь получить доступ, не связаны с домашней страницей, единственный способ получитьих путем поиска имени учителя в поле поиска.

Я пытался написать следующий паук, но это не сработало:

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.loader import XPathItemLoader
from scrapy.http import Request

from rmt.items import RmtItem_2

class RmtSpider(CrawlSpider):

    name = 'rmtspider_4'
    allowed_domains = ['uk.ratemyteachers.com']
    start_urls = ['http://uk.ratemyteachers.com/[-a-z0-9/]-t+$',]                 

    def parse_category(self, response):

        main_selector = HtmlXPathSelector(response)

        xpath = '//div[@class="main-c"]'
        sub_selectors = main_selector.select(xpath)
        for selector in sub_selectors:            
            item = RmtItem_2()

            l = XPathItemLoader(item=item, selector=selector)
            l.add_value ('url', response.url)
            l.add_xpath('name', '//div[@class="breadcrumb"]/a[5]/text()')
            l.add_xpath('school', '//div[@class="breadcrumb"]/a[3]/text()')
            l.add_xpath('department', '//div[@class="breadcrumb"]/a[4]/text()')
            l.add_xpath('total_ratings', '////div[@class="desc-details"]/span/text()')
            l.add_xpath('location', '//div[@class="breadcrumb"]/a[2]/text()')


            yield l.load_item()

Буду признателен, если кто-нибудь сможет мне помочь с этой проблемой.Заранее благодарю.

Ответы [ 4 ]

1 голос
/ 03 июля 2011

Как говорили люди, прежде чем применять регулярное выражение для фильтрации нужных вам учителей, вам нужно получить ссылки.Получение ссылок с помощью грубой силы нелепо.

Так что вам нужно использовать форму поиска, чтобы получить ссылки учителей.Используйте что-то вроде этого:

class MySpider(BaseSpider):

    def start_requests(self): # http://doc.scrapy.org/topics/spiders.html#scrapy.spider.BaseSpider.start_requests
        return [FormRequest("http://uk.ratemyteachers.com/SelectSchoolSearch.php",
                        formdata={'user': 'john', 'pass': 'secret'}, # put your parameters here - use FireBug to see the post data you need
                        callback=self.parse_search)]

    def parse_search(self, response):
        ...

Или, как сказал Филип Саутхэм, - проанализируйте все школы, найдите ссылки всех учителей и отфильтруйте те, которые вам нужны., но вам придется сделать это самостоятельно - прочитайте документацию и источники для scrapy.

1 голос
/ 28 июня 2011

Есть несколько способов приблизиться к нему

(i) Вы можете отправить почтовый запрос для имитации поиска, а затем извлечь URL для этого конкретного учителя

(ii) Если все учителя принадлежат к одной и той же школе, найдите каталог школ на одном сайте и просмотрите всех учителей.

1 голос
/ 30 июня 2011

Почему бы вам не начать сканирование с карты сайта и пройти по этим страницам к учителю?

0 голосов
/ 28 июня 2011

Я слышал много хорошего о HTML Agility Pack (хотя я не использовал его):

http://html -agility-pack.net /? Г = CodePlex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...