我正在寻找爬取多个演出列表网站以编译最终列表指南,其中包含返回原始网站的链接。
很多这些网站都没有 API,所以我必须使用一个相当粗略的 php 脚本来提取我需要的数据。(例如日期、地点、国家等)
大多数网站都有一个相当容易使用的演出目录,但在某些网站上,他们需要手动输入信息才能获得“相关”节目给你。
所以为了解决这个问题,我创建了一个循环,该循环基于:
page.php?id=$counter+1
所以它会找到最后插入到数据库中的 gig 并继续获取下一个 100 左右的数据。
但这仅在网站上的演出将在数字上准确地继续进行的情况下才有效,当然,它们不会由于取消等原因。
这给我留下了美好的
Warning: file_get_contents(http://www.domain.com/show/page.php?id=123456) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in...
如何创建一个能够跳过这些错误并继续进行而不是仅仅坐在它们上面的循环?
以下是整个代码(目前测试限制为+5)
include_once('simple_html_dom.php');
$cntqry = mysql_query("SELECT * FROM `gigs_tbl` ORDER BY `counter` DESC LIMIT 1");
$cntnum = mysql_num_rows($cntqry);
if($cntnum!=0)
{
$cntget = mysql_fetch_assoc($cntqry);
$start = $cntget['counter'];
}
else {
$start = 10767799;
}
$counter = 0;
$limit = $start +5;
for($start; $start < $limit; $start++) {
$counter = $start + 1;
$target_url = "http://www.domain.com/show/page.php?id=$counter";
$html = new simple_html_dom();
$html->load_file($target_url);
foreach($html->find('div[class=vevent]') as $showrow){
$artist = strip_tags($showrow->find('h2',0));
$genre = strip_tags($html->find('span[class=genre]',0));
$venue = strip_tags($showrow->find('span[class=location]',0));
$street = strip_tags($html->find('span[itemprop=streetAddress]',0));
$locality = strip_tags($html->find('span[itemprop=addressLocality]',0));
$postcode = strip_tags($html->find('span[itemprop=postalCode]',0));
$country = strip_tags($html->find('span[itemprop=addressRegion]',0));
$originalDate = strip_tags($html->find('meta[itemprop=startDate]',0)->content);
$newDate = date("U", strtotime($originalDate));
// INSERT
mysql_query("INSERT INTO `gigs_tbl` VALUES('','$counter','$newDate','$venue','$street','$locality','$postcode','$country','$gen re','$artist','reverbnation')");
}
}
任何能猜出是哪个网站导致此问题的人都可以虚拟击掌十次;)