首页 文章

我如何使用scrapy来解析JS中的链接?

提问于
浏览
3

我试图让scrapy解析页面上的链接来刮擦 . 不幸的是,此页面上的链接包含在JavaScript onclick功能中 . 我想使用SgmlLinkExtractor规则来提取解析JavaScript的链接,并创建用于callback ='parse_item'的URL(如果可能) .

以下是使用JS函数的每个链接的示例:

<a onclick="window.open('page.asp?ProductID=3679','productwin','width=700,height=475,scrollbars,resizable,status');" href="#internalpagelink">Link Text</a>

我只需要链接提取器发送回调parse_item:http://domain.com/page.asp?ProductID=3679

我如何编写CrawlSpider规则来执行此操作?

如果这不可能,那么最终能够解析在定义的一组起始页上嵌入这种JavaScript链接格式的所有页面的最佳方法是什么?

谢谢你们 .

2 回答

  • 5

    您可以使用SgmlLinkExtractorattrs 参数 .

    attrs(list) - 查找要提取的链接时应考虑的属性列表(仅适用于tags参数中指定的那些标记) . 默认为('href',)

    BaseSgmlLinkExtractorprocess_value 参数:

    process_value(callable) - 一个函数,它接收从标签中提取的每个值和扫描的属性,并可以修改该值并返回一个值,或者返回None以完全忽略该链接 . 如果没有给出,process_value默认为lambda x:x .

    所以你要为“onclick”属性的值写一个解析函数:

    def process_onclick(value):
        m = re.search("window.open\('(.+?)'", value)
        if m:
            return m.group(1)
    

    让我们检查一下正则表达式:

    >>> re.search("window.open\('(.+?)'",
    ...           "window.open('page.asp?ProductID=3679','productwin','width=700,height=475,scrollbars,resizable,status');"
    ...          ).group(1)
    'page.asp?ProductID=3679'
    >>>
    

    然后在 Rule 中使用 SgmlLinkExtractor

    rules=(
        Rule(SgmlLinkExtractor(allow=(),
                               attrs=('onclick',),
                               process_value=process_onclick),
             callback='parse_item'),
    )
    
  • 0

    也许 BaseSpiderCrawlSpider 更合适 .

    您可以提取要爬网的链接并在 Request 对象中对其进行重新排序,然后发出此 Request object ,如下所示:

    def parse_xxx(self, response):
        """do some work"""
        req_objs = []
        req_objs.append(Request(SOME_URL, SOME_ARGS))
        """Add more `Request` objects"""
        for req in req_objs:
            yield req
    

相关问题