从包含正则表达式的网址中搜集

时间:2011-06-28 11:59:07

标签: url expression scrapy

我一直试图从网站上抓取数据:http://uk.ratemyteachers.com/。我想从一些我不知道网站名称的老师那里获取信息。

每位教师在网站上都有一个遵循常规模式的页面。例如,这位老师Lois Bank存储在:http://uk.ratemyteachers.com/lois-banks/184618-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 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题

(i)您可以提交post request来模拟搜索,然后提取该特定教师的网址

(ii)如果所有教师都来自同一所学校,请在同一网站上找到学校目录,并抓取所有教师。

答案 1 :(得分:1)

为什么不从sitemap开始抓取并通过这些页面向教师开始?

答案 2 :(得分:1)

正如人们所说,在应用正则表达式过滤掉您需要的教师之前,您需要获取链接。通过蛮力获取链接是荒谬的。

因此,您需要使用搜索表单来获取教师的链接。使用这样的东西:

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):
        ...

正如Philip Southam所说 - 解析所有学校,获取所有教师的链接并过滤掉你需要的那些。

我想你需要更多的例子,但你必须自己做 - 阅读文档和scrapy来源。

答案 3 :(得分:0)

我听说过很多关于HTML Agility Pack的好东西(尽管我没有使用它):

http://html-agility-pack.net/?z=codeplex