python抓取网页数据(法国亚马逊、美国亚马逊-viewer列表的数据)

优采云 发布时间: 2021-12-04 15:10

  python抓取网页数据(法国亚马逊、美国亚马逊-viewer列表的数据)

  前段时间,姐姐子公司的老板让她在法国亚马逊评论列表的前100页找出1000个评论用户的*敏*感*词*。1000个用户,你需要一一阅读然后记录,并不是每个评论用户都会保留他们的个人*敏*感*词*。所以问题来了。这种费时费力的工作如果手工完成,要花两天时间才能找到前30页数据(还有其他任务要做),然后就很累了。本着求救的原则(如果节目能找到妹子就太好了,所以心里很苦恼),想帮她做点什么。

  我自己的工作是开发游戏客户端。主要使用的开发语言是lua和c++,从未接触过网页或相关工作。只是我在工作中使用了python脚本,在网上查python相关资料的时候,看到有网友用python写爬虫来做点什么。于是我想,我也可以用python写爬虫去亚马逊的网站去抓取数据吗?就这样,现在学习使用,开始打码。

  环境:

  Windows 7的

  蟒蛇:2.7

  使用的 Python 插件:

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

  re插件,用于正则匹配;

  codecs 插件用于编码转换和数据存储。

  目前实现的功能:

  在法国顶级浏览者列表的前 100 页中抓取 1,000 位用户的姓名、联系信息(网站 链接或电子邮件)、国籍(可能有卢森堡和瑞士买家在法国亚马逊上购买),以及详细的用户评论 页面链接等数据。

  通过抓取法国亚马逊热搜榜数据,扩展为抓取中国亚马逊和美国亚马逊热搜榜数据。理论上,通过简单的修改,可以捕捉到不同国家亚马逊热搜榜的数据。

  需要改进的方面:

  写完代码,发现在抓数据的过程中效率很低。捕获1000条数据需要很长时间,捕获几页或几十页后,程序无法运行并卡住。它只能关闭和打开。当时,在扩展到美国采集中国和亚马逊的数据之前,我想到的可能原因是:

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

  以上三点是我想到的导致爬行效率低下的可能原因。后来我扩展了同一套代码,分别抓取了中国和美国亚马逊的数据,验证了第二个原因对整个爬虫工作的影响程度,发现影响非常大!在同等带宽和硬件条件下,中美前100页有1000个评论用户,爬取大约需要半个小时,而我爬取法国的1000条数据则用了将近一个下午(因为我老是卡住,我觉得打开网页的时候urllib没反应,我的程序也没做出判断。)一个个爬,但是总比女孩子一个个打开网页然后记录好,至少人家不会讨厌!然后花了半个小时从中国和美国捕获数据。我个人不喜欢花费的时间,并判断它是否花费了太多或几乎。但是作为开发者,程序总是可以优化的!

  想法:

  当我看到一个网友写的爬虫时,我的想法是打开网页,匹配我需要的信息。所以我的思路是这样的:通过python的urllib和urllib2插件打开页面,然后转换成html数据,用python的re-regular插件做正则匹配,获取页面,用户详情页面,用户*敏*感*词*和其他信息。

  执行:

  1、 法国亚马逊的顶级评论列表大约有1000个网页,每个页面有10个用户数据。对于每个页面,除了第一页的链接,其他页面的链接都是与页数相关的,比如代表23页的数据,那么通过简单的字符串拼接就可以得到1000页的页面链接。这是关于如何获取每个页面的链接;示例代码如下:

  一种。拼接页面链接,因为首页和其余页面的格式略有不同,所以分开处理:

  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);

  湾 将页面转换为html:

  try:

page = urllib.urlopen(url)

html = page.read()

return html

except:

print "getHtml2 error"

  我用try和except看看能不能解决打不开网页的问题(估计是法国亚马逊抓取卡住了,因为网站没有响应),但是没用;

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

  一种。匹配每个用户的唯一标识符:

  reg = r'href="(/gp/pdp/profile/.+?)"><b>'

captureRe = re.compile(reg)

cpList = re.findall(captureRe,html)

  湾 放在一起链接:

  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进行屏蔽;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线