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

优采云 发布时间: 2022-03-05 10:01

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

  前段时间,姊妹公司的老板让她在法国亚马逊评论列表的前100页找到1000位评论者的*敏*感*词*。1000个用户需要一一阅读和记录,并不是每个评论用户都会留下个人*敏*感*词*。那么问题来了,这种费时费力的工作,如果手动完成,前30页的数据要花两天时间才能找到(还有其他工作要做),然后就很累了。本着苦恼的原则(程序员能找到一个女孩就好,所以我不得不心疼),我想帮她做点什么。

  我自己的工作是开发游戏客户端。我使用的主要开发语言是lua和c++,没有网页和网站相关工作的经验。只是我在工作中使用了python脚本,然后在网上找python相关资料的时候,看到网友用python写爬虫来做点什么。所以我想,我也可以用python写一个爬虫从亚马逊的网站获取数据吗?这样,现在正在学习和使用的人开始输入代码。

  环境:

  Windows 7的

  蟒蛇:2.7

  使用的python插件:

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

  用于常规匹配的重新插件;

  编*敏*感*词*插件用于编码转换和数据存储。

  目前实现的功能:

  获取姓名、联系信息(网站 链接或电子邮件地址)、国籍(可能是来自卢森堡和瑞士的买家,在法国亚马逊顶部查看者列表的前 100 页中的 1,000 名用户中),以及详细的用户评论链接到页等

  通过抓取法国亚马逊top-viewer list的数据,扩展为抓取中国和美国亚马逊top-viewer list的数据。理论上,不同国家的亚马逊top-viewer list的数据可以通过简单的修改来获取。

  需要改进的方面:

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

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

  以上三点是我想到的爬取效率低的可能原因。后来我扩展同组代码爬取了中国和美国亚马逊的数据,验证了第二个原因对整个爬取工作的影响,结果发现影响非常大!同等带宽和硬件条件下,中美前100页共有1000个评论用户,爬了大概半个小时,爬完法国的1000条数据我用了将近一个下午(因为老是卡住,我觉得应该是因为urllib打开网页没反应,我的程序没有做判断)依次爬取,但总比女生一个个打开网页记录好,至少人不会烦!然后用了半个小时,在中国和美国抓到了数据。我个人不判断是否花费了太多时间或几乎相同。但是作为开发人员,程序总是可以优化的!

  想法:

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

  执行:

  1、法国亚马逊的top review list大约有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 and 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进行封IP;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线