Python 刮皮没有';不要爬行所有链接

Python 刮皮没有';不要爬行所有链接,python,web-crawler,scrapy,scrapy-spider,Python,Web Crawler,Scrapy,Scrapy Spider,我想从中提取数据。Scrapy正在工作,但是它似乎只会刮取开始\u URL,不会抓取任何链接 我想蜘蛛爬整个网站 以下是我的代码: from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import S

我想从中提取数据。Scrapy正在工作,但是它似乎只会刮取
开始\u URL
,不会抓取任何链接

我想蜘蛛爬整个网站

以下是我的代码:

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'
,另一个是


如何让爬虫程序同时跟踪这两种链接?

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

解决当前问题的方法是:
scrapy.spider.BaseSpider
类不会对指定的
规则执行任何操作。相反,请使用
scrapy.contrib.spider.CrawlSpider
类,该类具有处理内置规则的功能

接下来,您需要将
parse()
方法切换为一个新名称,因为
CrawlSpider
在内部使用
parse()
(我们将假设
parse\u page()
用于此答案的其余部分)

若要获取所有基本链接并对其进行爬网,需要更改链接提取器。默认情况下,您不应该对要遵循的域使用正则表达式语法。以下内容将获取链接,并且您的
DUPEFILTER
将筛选出不在站点上的链接:

rules = (
    Rule(SgmlLinkExtractor(allow=('')), callback="parse_page", follow=True),
)
至于
onclick=…
链接,这些是JavaScript链接,您试图处理的页面严重依赖它们。Scrapy无法抓取
onclick=location.href=“JavaScript:showLayer\u tap('2')”
onclick=“win\u open”之类的内容('./bbs/profile.php?mb_id=wlsdydahs'
,因为它无法在Javascript中执行
showLayer\u tap()
win\u open()

(以下内容未经测试,但应该有效,并提供您需要做的基本想法)

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

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


您应该继承自
CrawlSpider
:尝试使用
类MetacriticSpider(CrawlSpider):
尝试规则:规则=[规则(sgmlLinkedExtractor(allow=(“*(\.html)$”),回调='parse_item',follow=True),]或allow=“”…尝试在允许的链接中使用regex电镀sellfree.co.kr.vipul sharma中存在两种链接,感谢您的回复,但您的解决方案无效。对不起,Paul,无论是否使用爬行蜘蛛,都是如此
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),