3

我想从http://community.sellfree.co.kr/中提取数据。Scrapy 正在工作,但它似乎只抓取start_urls,并且不抓取任何链接。

我希望蜘蛛抓取整个网站。

以下是我的代码:

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 metacritic.items import MetacriticItem
class MetacriticSpider(BaseSpider):
    name = "metacritic" # Name of the spider, to be used when crawling
    allowed_domains = ["sellfree.co.kr"] # Where the spider is allowed to go
    start_urls = [
        "http://community.sellfree.co.kr/"
    ]
    rules = (Rule (SgmlLinkExtractor(allow=('.*',))
          ,callback="parse", follow= True),
        )

    def parse(self, response):
        hxs = HtmlXPathSelector(response) # The XPath selector
        sites = hxs.select('/html/body')
        items = []
        for site in sites:
            item = MetacriticItem()
            item['title'] = site.select('//a[@title]').extract()
            items.append(item)
        return items

页面上有两种链接。一个是onclick="location='../bbs/board.php?bo_table=maket_5_3'另一个是<a href="../bbs/board.php?bo_table=maket_5_1&amp;sca=프로그램/솔루션"><span class="list2">solution</span></a>

如何让爬虫跟踪这两种链接?

4

1 回答 1

2

在开始之前,我强烈建议使用更新版本的 Scrapy。看来您仍在使用旧的,因为您使用的许多方法/类已被移动或弃用。

对于手头的问题:该scrapy.spiders.BaseSpider课程不会对rules您指定的内容做任何事情。相反,请使用scrapy.contrib.spiders.CrawlSpider该类,它具有处理内置规则的功能。

接下来,您需要将您的parse()方法切换到一个新名称,因为CrawlSpider使用在parse()内部工作。(我们将假设parse_page()这个答案的其余部分)

要获取所有基本链接并对其进行爬网,您需要更改链接提取器。默认情况下,您不应该对要关注的域使用正则表达式语法。以下内容将获取它,您DUPEFILTER将过滤掉不在网站上的链接:

rules = (
    Rule(SgmlLinkExtractor(allow=('')), callback="parse_page", follow=True),
)

至于onclick=...链接,这些是 JavaScript 链接,您尝试处理的页面严重依赖它们。Scrapy 无法抓取onclick=location.href="javascript:showLayer_tap('2')"or之类的东西onclick="win_open('./bbs/profile.php?mb_id=wlsdydahs',因为它无法在 Javascript 中执行showLayer_tap()or 。win_open()

(以下内容未经测试,但应该可以工作并提供您需要做什么的基本概念)

不过,您可以编写自己的函数来解析这些。例如,以下可以处理onclick=location.href="./photo/"

def process_onclick(value):
    m = re.search("location.href=\"(.*?)\"", value)
    if m:
        return m.group(1)

然后添加以下规则(这只处理表,根据需要展开):

Rule(SgmlLinkExtractor(allow=(''), tags=('table',), 
                       attrs=('onclick',), process_value=process_onclick), 
     callback="parse_page", follow=True),
于 2015-09-22T23:33:57.553 回答