相比于Wish、AliExpress爬虫Amazon算是比较复杂的了。首先第一步登录,就是比较难处理的,因为需要手机短信验证码。而我们有没用专门接收短信验证码的设备,就只有使用已经登录好的浏览器Cookie来授权了。
当好不容易解决了登录之后,会发现amazon还需要切换站点、切换语言等等操作。这些后面在介绍,这里就先介绍Cookie方式实现登录。
为了处理这些,我先开发了一个浏览器插件。用户登录Amazon后,记录下当前的Cookie信息,然后存到数据库中,当爬虫需要的时候再从数据库里面取出来。
插件获取Cookie的核心代码:
var az_data = {
cookie_jar: '',
user_agent: '',
site_domain: '',
shop_id: 0
};
function getCookiesByAmazonCoUk() {
chrome.cookies.getAll({}, function(cookies) {
var cookie_array = new Array();
for (var i in cookies) {
var cookie = cookies[i];
if (cookie.domain === ".amazon.co.uk") {
cookie_array.push(cookie)
}
}
az_data.cookie_jar = JSON.stringify(cookie_array);
});
}
获取amazon.co.uk站点的Cookie信息,并转成JSON字符串。
有了Cookie信息,那么就好办了,下面代码实现登录。有Python和Java两种版本。
Python版本
def add_cookie(driver, domain, cookies):
for cookie in cookies:
if cookie['domain'].find('services.') != -1:
continue
if cookie['domain'][0] != '.':
cookie['domain'] = '.' + cookie['domain']
try:
driver.add_cookie(cookie)
except InvalidCookieDomainException as e:
print('can\'t set cookie: ', e)
需要去掉services否则可能报错,另外如该domain不是以.开头的,需要加上.,否则也会报错。另外在添加Cookie之前需要先请求一次Amazon网页,然后在调用delete_all_cookies()函数清除所有的Cookie在add_cookie之前。
cookies 是之前浏览器获取到的Cookies转换后的List
cookies = json.loads('从数据库取出的az_data.cookie_jar')
Java版本
List<String> pairs = new ArrayList<>(cookies.size());
for (Map cMap : cookies) {
String name = cMap.get("name").toString();
String value = cMap.get("value").toString();
String path = cMap.get("path").toString();
String domain = cMap.get("domain").toString();
if (domain.indexOf("services") != -1) {
continue;
}
if (domain.charAt(0) != '.') {
domain = "." + domain;
}
driver.manage().addCookie(new Cookie(name, value, domain, path, null));
}
注意事项与Python一样。但Python可以将整个dict添加到PhantomJS中,而Java必须按Cookie类的构造器参数来指定。
cookies 是之前浏览器获取到的Cookies转换后的List
List<Map> cookies = JSON.parseArray('从数据库取出的az_data.cookie_jar', Map.class);