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

时间:2013-12-13 00:23:04

标签: javascript python web-scraping scrapy

我正在尝试使用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 个答案:

答案 0 :(得分:5)

您可以使用SgmlLinkExtractorattrs参数。

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

process_value参数:

  
      
  • process_value (可调用) -   接收从标签中提取的每个值和扫描的属性的函数,可以修改该值并返回一个值,或者返回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'),
)

答案 1 :(得分: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