刮痧(正则表达式)问题

时间:2011-06-03 18:47:00

标签: php regex web-scraping

我一直在尝试构建一个简单的刮刀,它会接受一个关键字,然后转到亚马逊并在搜索框中输入关键字,然后仅搜索主要结果。

问题是正则表达式无效。我尝试了很多不同的方法,但它仍然无法正常工作。

   $url = "http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=dog+bed&x=0&y=0";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$return = curl_exec($ch);
curl_close($ch);

preg_match_all('(<div.*class="data">.*<div class="title">.*<a.*class="title".*href="(.*?)">(.*?)</a>)', $return, $matches);

var_dump($matches);

现在,亚马逊的HTML代码如下所示:

<div class="title">
<a class="title" href="https://rads.stackoverflow.com/amzn/click/com/B00063KG7S" rel="nofollow noreferrer">Midwest 40236 36-By-23-Inch Quiet Time Bolster Pet Bed, Fleece</a>
        <span class="ptBrand">by Midwest Homes for Pets</span>
 <span class="bindingAndRelease">(Nov 30, 2006)</span>
        </div>

我试图用百万种不同的方式改变正则表达式,但是我在过去几个月里学到的东西根本不起作用。当然,如果我只是将其更改为href =“(。*?)” - 我会在那里得到每个链接......但是当我添加到

任何建议都将不胜感激!

4 个答案:

答案 0 :(得分:1)

请注意,请求帮助抓取受版权保护的内容的此类问题违反了SO的Terms of Use,特别是有关订阅者内容的部分说明:

“订阅者声明,保证并同意其不会提供任何订阅者内容(a)侵犯,违反或以其他方式干扰另一方的任何版权或商标”

有关此问题的持续讨论,请参阅https://meta.stackexchange.com/questions/93698/web-scraping-intellectual-property-and-the-ethics-of-answering/93701#93701

答案 1 :(得分:1)

使用正则表达式解析复杂结构通常会失败。正则表达式变得复杂,甚至你付出了很多努力,它从来没有正常工作。这取决于您想要分析的数据的性质以及正则表达式的限制。

当网站不那么复杂时,我做了以下工作,这通常适用于快速解决方案:

找到一个字符串,标记有趣的部分的开头,之前切断了一切。然后找到一个标记结束的字符串,然后删除所有内容。

然后解析:)

现在如果你需要一些灵活的东西,你自己写一个缓存层,这样你就可以自动获得需要抓取的资源的副本,这样你就可以编码你的刮刀,而无需一直重复请求外部数据。在制定正确的抓取策略时(它不会那么快地改变)。

然后将HTML转换为XML,例如使用PHP中的DomDocument。一旦你做了两三次,那就非常有效。您可能会遇到编码问题和语法问题,但这些问题可以解决。与几年前相比,情况要好得多。

然后你可以进入Xpath,这对于在XML上运行表达式非常灵活。

但是旁边有一个非常酷的PHP库:FluentDOM

它结合了DomDocument,XPath和PHP的优点,非常灵活。

一些例子&amp; FluentDOM的作者提供的资源我可以建议:

答案 2 :(得分:0)

您应该使用XML解析器+ XPath而不是正则表达式来执行此操作... XML + RE = bad idea

另外,对于Amazon Termes of Use,你没有打算做什么?

答案 3 :(得分:0)

我在PHP中没有这样做,但我在Python中做过类似的事情。我怀疑正确的方法是使用像http://simplehtmldom.sourceforge.net/这样的HTML DOM解析器,它解析HTML并将其转换为对象供您使用。