网站上线前都需要弄点“假数据”让网站好看点,一般公司都是从AMAZON的店铺上把热销的产品review放到网站上,无奈AMAZON防爬虫的功夫一流(主要是我懒得再写爬虫有现成的为什么不用?),magento好像也没有这样的插件,当然你的老板愿意手动复制粘贴就另当别论了,反正这个世界傻子总是不缺的。下面我们来BB一下怎么抓取然后导入到magento。
提前申明我不是给某软件来打广告的
准备工作
1、高速翻墙软件(如果你不介意慢的话可以不开)
2、下载安装后羿采集器(自行百度)
开始抓取
1.打开要采集的amazon产品页面,拖动滚动条到review,点击“See all 4,571 reviews”跳转到评论详情页,并复制浏览器上的地址;
2.打开采集器在输入框内粘贴地址,点击“智能采集”;(若你电脑上装有360可能会弹出警告,勾选不再提醒,允许即可)
然后滚动采集器的滚动条会自动滚到页面底部,最好不要切换屏幕干别的,目的是让采集器识别网页内容,识别完成后采集器下方会出现能采集到的数据:
3.设置采集范围,很显然我们不需要采集所有数据,若这个产品评论有几千条我们只需要采集1-5页即可不要太多,点击“设置采集范围”
4.过滤采集内容,
采集到的内容有很多是我们不需要的,在标题栏上右键“删除字段”删除不需要的数据
不需要的数据有“标题链接、头像、a-color-tertiary、a-link-normal、a-color-seconddary1”
网站需要的字段有 标题,a-icon-alt, a-color-seconddary,a-section,review-text
5.补充缺少的字段 ,在采集结果里面我们找不到用户上传的图片,点击“添加字段”,把页面滚动到有图片的review上,将鼠标移动到评论图片上点一下即可识别这个字段(注意:图片字段采集器无法拿到大图拿到的是缩略图,所以不是很推荐加这个字段,大图可以手动点开下载,或者不要图也行)
6.产品的sku或id字段 ,这个字段amazon上是没有的,要导入到magento我们必须根据sku或产品ID来,所以要手动添加一个,
点击“添加字段”并将这个字段拖到最前面,在字段标题上右键“数据处理”
在步骤详情里面填这个产品的sku
结果如下:
7.提取评分,我们只需要提取客户打的分数,当前的“5.0 out of 5 stars”显然不合要求,在a-icon-alt上右键选择“数据处理”
在弹出框内点“新建”选“正则提取”并在“步骤详情”内填入正则表达式如图,点确定即可
8.字段排序,我是按照:评论标题-评论内容-评分-用户名-时间-图片 的顺序排列因为一会还要用程序读取,鼠标按左键住要排序的标题栏左右拖动
9.过滤掉不合格的评论,我们不希望把评分太低的评论或带视频的评论抓取,点击“数据筛选”
10.开始采集数据,等待任务完成,点“导出数据”按钮,保存地址选你熟悉的文件夹点“导出”;
11.编写解析程序(我的字段可能跟你不一样不要无脑照搬)
<?php
/**
*Author: YafullyZhao
*Date: 20190812
*Discription: Write Amazon Review csv Data to mysql
*Email: yafully@gmail.com
*/
require_once 'app/Mage.php';
Mage::app();
$_read = Mage::getSingleton('core/resource')->getConnection('core_read');
$_write = Mage::getSingleton('core/resource')->getConnection('core_write');
$customerId = '1';//用户ID
// Remove existing ratings 清除老数据
$clearOldData = false;
if($clearOldData){
$_write->query("SET FOREIGN_KEY_CHECKS = 0;");
$_write->query("TRUNCATE TABLE rating_option_vote;");
$_write->query("TRUNCATE TABLE review_detail;");
$_write->query("TRUNCATE TABLE review_entity_summary;");
$_write->query("TRUNCATE TABLE review_store;");
$_write->query("TRUNCATE TABLE review;");
$_write->query("TRUNCATE TABLE rating_option_vote_aggregated;");
$_write->query("SET FOREIGN_KEY_CHECKS = 1;");
}
//echo '<p>Bulk Add Reviews</p>';
$cvsDatas = Mage::helper('Function')->getCsvData(Mage::getBaseDir('media').'/data/reviews-data.csv');
$i = 0;
$total = count($cvsDatas);
//echo '<p>Total'.$total.'</p>';
//while( $csv_line = fgetcsv($file_handle) ){
//0 SKU,1 Title,2 Detail,3 Vote,4 Nick Name,5 Creat Date,6 Pics,7 Videos
foreach ($cvsDatas as $csv_line) {
if( !is_array($csv_line) ) {
break;
}
$sku = trim($csv_line[0]);//产品SKU
$review_name = ucwords( strtolower( trim( $csv_line[1] ) ) );
$details = trim( $csv_line[2] );
$rating_value = (int)$csv_line[3];
if( empty( $rating_value ) ){
continue;
}
// Create a single name
$nickname = ucwords( strtolower( trim( $csv_line[4] ) ) );
//$email = strtolower( trim( $csv_line[7] ) );
if( !$created = strtotime( trim($csv_line[5]) ) ){
$created = time();
}else{
$created = strtotime(trim($csv_line[5]));
}
$piclist = empty($csv_line[6]) ? null : $csv_line[6];
$videolist = empty($csv_line[7]) ? null : $csv_line[7];
$approval_status = 1;
$_product = Mage::getModel('catalog/product')->loadByAttribute('sku',$sku);
if(!$_product) {
print '<p>Unmatched SKU: ' . $sku . '</p>';
continue;
}
// Add the review
$_review = Mage::getModel('review/review')
->setEntityPkValue($_product->getId())
->setStatusId($approval_status)
->setTitle($review_name)
->setDetail($details)
->setPiclist($piclist)
->setVideolist($videolist)
->setEntityId(1)
->setStoreId(1)//店铺
->setStores(array(1,0))
->setCustomerId($customerId)
->setNickname($nickname)
->save();
//echo '<p>save!</p>';
// Set the created date
$_write->query("UPDATE review SET created_at = '" . date('Y-m-d H:m:s', $created) . "' WHERE review_id = " . $_review->getId());
$_review->aggregate();
// Map your rating_id to your option_id with an array or something
$rating_options = array(
3 => array(11,12,13,14,15),
);
// Now save the ratings
foreach($rating_options as $rating_id => $option_ids){
try {
$_rating = Mage::getModel('rating/rating')
->setRatingId($rating_id)
->setReviewId($_review->getId())
->setCustomerId($customerId)
->addOptionVote( $option_ids[$rating_value-1],$_product->getId() );
} catch (Exception $e) {
print_r($e);
die($e->getMessage());
}
}
//if($i+1>$total) echo '<p>Done!</p>';
$i++;
print '<p>Write: ' . $i . '</p>';
}
运行结果: