gpt4 book ai didi

python - scrapy 没有抓取所有链接

转载 作者:行者123 更新时间:2023-11-28 17:43:21 25 4
gpt4 key购买 nike

我想从 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>

如何让抓取工具跟踪这两种链接?

最佳答案

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

对于手头的问题:scrapy.spiders.BaseSpider 类不会对您指定的规则 做任何事情。相反,使用 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')"onclick="win_open('./bbs/profile.php?mb_id=wlsdydahs' ,因为它无法在 Javascript 中执行 showLayer_tap()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),

关于python - scrapy 没有抓取所有链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com