利用Python抓取亚马逊评论列表数据

  前段时间,我家妹子公司老板叫她去将法国亚马逊评论列表的前100页共1000个评论用户的联系方式找出来。1000个用户,要一个个的去看再记录下来,而且并不是每个评论用户都会将个人的联系方式留下来。那么问题来了,这样费时费力的工作如果人工去做的话,那么就是花了两天的时间也就找了前30页的数据(还有别的工作要做),然后累的够呛的。本着心疼的原则(程序猿能找到妹子就很不错了,所以得心疼着),就想帮着她做点事。

  我本身的工作是做游戏客户端开发的,主要使用的开发语言是lua和c++,并没有接触过网页、网站相关的工作。只是工作中有用到过python脚本,然后有一次在网上查python的相关资料的时候,有看到网友用python写爬虫干点事的。所以我就想,我是否也能够实用python来写爬虫去亚马逊的网站抓取数据呢?就这样现学现用的开始敲起代码来了。



环境:

  windows7

  python:2.7

利用的python插件:

  urllib2、urllib插件,用了打开网页链接;

  re插件,用来做正则匹配;

  codecs插件,用来做编码转换及数据保存。

目前实现的功能:

  抓取法国亚马逊top-viewer列表前100页共1000个用户的姓名、联系方式(网站链接或者邮箱)、国籍(可能有卢森堡、瑞士的买家在法国亚马逊购买)、用户评论详细页面的链接等数据。

  通过抓取法国亚马逊top-viewer列表数据,进而扩展到抓取中国亚马逊、美国亚马逊top-viewer列表的数据。理论上通过简单的修改可以抓取不同国家亚马逊top-viewer列表的数据。

需改进的地方:

  代码写好之后,抓取数据的过程中发现效率好低,1000个数据需要花费很长的时间才能抓取完,而且抓取了几页或者几十页之后程序就跑不动了,卡住只能关掉再开。当时在没有扩展到抓取中国、美国亚马逊的数据之前,我想到的可能原因有:

  1. 正则表达式有优化空间,因为我之前没有接触过正则表达式,没有使用过;
  2. 法国亚马逊网站在国内访问速度慢,影响到了数据的抓取;
  3. python没有系统的学过,在一些语法或者第三方辅助插件的使用上不够熟悉。

  以上三点是我想到的造成抓取效率低下的可能的原因。后来我把同一套代码扩展到抓取中国、美国亚马逊的数据,以验证第二条原因对整个抓取工作的影响程度,结果发现影响非常大!同样的带宽、硬件条件下,中国、美国的前100页共1000个评论用户,抓取大概花了半个多小时,而抓取法国的那1000个数据,花了我近一个下午的时间(因为总是卡住不动,我想应该是urllib打开网页未响应而我的程序没有做判断)才陆陆续续的抓取完,不过也总比妹子一个一个的打开网页再记录下来好,至少人不会烦!然后对中国、美国数据抓取花了半个小时时间,对这个时间花费我个人不好评判是花多了还是说差不多了。但是作为一个开发人员来说,程序总是可以做优化的!

思路:

  当时看到网友写的爬虫,思路就是打开网页、匹配自己需要的信息。因此我的思路也是跟着这个来的:通过python的urllib和urllib2插件打开页面,再转换为html数据,利用python的re正则插件去做正则匹配,得到页面、用户详细信息页面、用户联系方式等信息。

具体实现:

1、法国亚马逊的top评论列表大概有1000个网页,每个页面有10个用户数据。每个页面,除了第一页的链接外,其它页面的链接都跟页面数相关,如http://xxx.page23.xxx 是代表23页的数据,因此可以通过简单的字符串拼接就可以得到1000个页面的页面链接了。这是关于得到各个页面链接的方法;示例代码如下:

a、拼接页面链接,因为第一页和其余页的格式稍微有点不同,所以分开来处理:

if 1 == i:
    html_link = "http://www.amazon.fr/review/top-reviewers/ref=cm_cr_tr_link_" + str(i);
else:
    html_link = "http://www.amazon.fr/review/top-reviewers/ref=cm_cr_tr_link_" + str(i) + "?ie=UTF8&page=" + str(i);

b、将页面转为html:

try:
    page = urllib.urlopen(url)
    html = page.read()
    return html
except:
    print "getHtml2 error"

我使用了try、except就是想看能不能处理打开不开网页的问题(我猜法国亚马逊抓取卡死是因为网站未响应了),但是没有效果;

2、每个页面有10个用户的数据,点开一个用户会跳转到其详细信息页面,通过查看不同详细信息页面的链接形式,发现都是类似的:一个可能是用户名的变量,一个表示该用户在评论列表中的排名值。因此我可以想办法得到用户名(猜想是用户名、或者是亚马逊保存的一个唯一标示)、用户在评论列表中的排名,然后拼接出用户详细信息页面的链接;通过查看页面的源码,发现每个页面中,用户信息的形式类似,都是诸如:/gp/pdp/profile/xxxx/这样的形式,因此可以通过简单的正则匹配得到xxxx这个数据,暂且称为用户唯一标示符。这是关于得到详细页面链接的方法;示例代码:

a、匹配每个用户的唯一标示符:

reg = r‘href="(/gp/pdp/profile/.+?)"><b>‘
captureRe = re.compile(reg)
cpList = re.findall(captureRe,html)

b、拼凑链接:

num = (i - 1) * 10 + index;
subLink = "http://www.amazon.fr" + cp + "/ref=cm_cr_tr_tbl_" + str(num) + "_name";

index指的是10个数据中具体哪个,num其实就是用户在评论列表中的排名,一页10个,所以能根据页码及index来算出具体的排名;

c、转为html:

headers = { #伪装为浏览器抓取
    ‘User-Agent‘:‘Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6‘
    }
req = urllib2.Request(url,headers=headers)
page = "";
try:
    page = urllib2.urlopen(req)
    html = page.read()
    return html
except:
    print "getHtml error"

可以看到这个跟前面的那个转换形式不一样,因为我发现利用前一种转换方式得到的页面数据,跟我们之间右键浏览器查看源代码的格式是有差异的,然后我在匹配联系方式的时候一直匹配失败,就以为是这个差异造成的。因此就查找了资料使用了上述形式来转换,网友也说这样能防止亚马逊针对频繁访问的ip做封ip处理;

3、不是每个评论者都提供了联系方式,但是提供了联系方式的只有两种形式:一个网站链接(博客或者啥);一个邮箱。通过查看源码发现:提供网站链接的,在源码中会有一个nofollow标签,而提供邮箱的则有一个mailto:关键词。有了这两个信息,那么我就可以据此来做正则匹配了。这就是关于得到联系方式的方法。这里也是两个正则表达式做正则匹配,跟上述代码类似就不上代码了;

4、后面又通过正则匹配得到了评论人姓名、国籍等信息。操作也跟3中提到的类似。

缺陷:

  1. 正如我在问题中提到的,抓取效率是一个大问题。1000个数据快都需要花费半个小时才能匹配抓取完,自我感觉效率上还可以提升;
  2. 在抓取法国亚马逊top-viewer数据的时候,程序一直卡死,但是我不能据此做问题处理,需再查查。

写在最后:

  这个小脚本大概花了一个下午的时间才折腾出来,然后又花了些时间去满足妹子提的其他需求,第二天才把最终抓取到的数据发送给妹子使用。但总的来说,比起妹子可能要花1个礼拜才能做完,我也是帮了点小忙了。而我自己本身也学到了东西:数据抓取!虽然我这只是简单得不能再简单的一种实现,但是也相当于稍微入了门,积累了点知识!


时间: 2024-12-18 04:51:02

利用Python抓取亚马逊评论列表数据的相关文章

用python爬取亚马逊物品列表

1. 仔细分析亚马逊查询详细界面可以看出来,主要关键部分有三个地方,这三个地方分别控制了查询列表的页面和关键字,所以修改这几个参数可以改变列表页数以及模糊查询的结果 http://www.amazon.cn/s/ref=sr_pg_3?rh=n%3A658390051%2Ck%3Aphp&page=3&keywords=Java&ie=UTF8&qid=1459478790 2. 通过基础链接以及正则表达式匹配的方法进行替换的方式改变爬取页面,注意由于使用了正则表达式匹配,

python爬虫----(6. scrapy框架,抓取亚马逊数据)

利用xpath()分析抓取数据还是比较简单的,只是网址的跳转和递归等比较麻烦.耽误了好久,还是豆瓣好呀,URL那么的规范.唉,亚马逊URL乱七八糟的.... 可能对url理解还不够. amazon ├── amazon │   ├── __init__.py │   ├── __init__.pyc │   ├── items.py │   ├── items.pyc │   ├── msic │   │   ├── __init__.py │   │   └── pad_urls.py │  

python+scrapy爬取亚马逊手机商品

1 # -*- coding: utf-8 -*- 2 3 # Define here the models for your scraped items 4 # 5 # See documentation in: 6 # http://doc.scrapy.org/en/latest/topics/items.html 7 8 import scrapy 9 10 11 class AmazonItem(scrapy.Item): 12 # define the fields for your

用python 抓取B站视频评论,制作词云

python 作为爬虫利器,与其有很多强大的第三方库是分不开的,今天说的爬取B站的视频评论,其实重点在分析得到的评论化作嵌套的字典,在其中取出想要的内容.层层嵌套,眼花缭乱,分析时应细致!步骤分为以下几点: F12进入开发者选项进入B站你想观看的视频页面,例如我看的是咬人猫的一个视频,进入开发者选项后,向下拉取视频评论,这时评论内容才被加载出来,此刻在开发者选项中网络那里就可以看到从网站获取的很多信息,仔细查找,发现我们想要的如下图:可以看到评论区的内容,点开消息头中的请求网址(https://

amazon爬取亚马逊页面信息

代码: # -*- coding: cp936 -*- import requests from lxml import etree ASIN = 'B00X4WHP5E' #ASIN = 'B017R1YFEG' url = 'https://www.amazon.com/dp/'+ASIN r = requests.get(url) html = r.text tree = etree.HTML(html) #获取产品单价 span = tree.xpath("//span[@id='pri

亚马逊——不一样的电商公司

其一: 电商公司就是电子商务公司.电子商务通俗的说就是利用电子工具进行各种商务活动,如网上购物.在线电子支付等.可以说电子商务是传统商业活动的电子化和网络化.离我们最近的就是网购了,通常我们会在淘宝.天猫.聚美优品.亚马逊等购物平台上购买东西,他们已然成为了我们生活的一部分.但我们不曾留意,他们分别代表着不同的电商公司,拥有不同的理念与策略.下面我们将通过与淘宝的对比,谈一下与众不同的电商公司亚马逊公司. 亚马逊公司,是美国最大的一家网络电子商务公司,于2004年进入中国.再他的发展史上有三次定

最新亚马逊 Coupons 功能设置教程完整攻略!

最新亚马逊 Coupons 功能设置教程完整攻略! http://m.cifnews.com/app/postsinfo/18479 亚马逊总是有新的创意,新的功能.最近讨论很火的,就是这个 Coupons 的新功能,位于 Advertising 下面新增了 Coupons,如下图. 最新的查找亚马逊差评的方式,就看这篇! 亚马逊查找差评 ,最新再破解干货! 但是群里很多伙伴说自己的账号没看到 Coupons,小编都懂.因为小编的账号也没有(哭). 但是我们找到了新的路径,可以连接到 Coupo

[python]初试页面抓取——抓取沪深股市交易龙虎榜数据

[python]抓取沪深股市交易龙虎榜数据 python 3.5.0下运行 没做自动建立files文件夹,需要手动在py文件目录下建立files文件夹后运行 #coding=utf-8 import gzipimport http.cookiejar import urllib.request import urllib.parse import json import os import time import datetime def getOpener(head): # deal with

亚马逊云平台采集转单机采集实现

实验室的一个项目采集亚马逊的商品数据,包括单体和变体采集.最开始的一个demo是单机版的java采集软件,后面根据导师的要求,实现了云端分布式采集——实验室提供采集设备资源,多机分布式多线程采集,用户只需在前台配置所需采集的URL即可,不需要挂机采集,从而给用户提供云端的采集服务. 项目组在实现的其中遇到了很多的技术难点,包括分布式架构的搭建,采集逻辑流程的设计以及亚马逊验证码的识别,代码的优化,经过了反复的研究,经过了几个月的测试,现已经基本实现主体功能,采集效率,客户也很满意.曾经在一天中,