亚马逊的网址构造很简单,几乎算是静态的网页,花费3小时完美收工,不要在意细节!

在python3下利用xpath就可以完美解决

xpath的使用方法请见:

python之lxml(xpath)

入口图界面为:

抓取操作为:

抓取的效果图如下:

图片:

excel:

  1. '''
  2. .======.
  3. | INRI |
  4. | |
  5. | |
  6. .========' '========.
  7. | _ xxxx _ |
  8. | /_;-.__ / _\ _.-;_\ |
  9. | `-._`'`_/'`.-' |
  10. '========.`\ /`========'
  11. | | / |
  12. |/-.( |
  13. |\_._\ |
  14. | \ \`;|
  15. | > |/|
  16. | / // |
  17. | |// |
  18. | \(\ |
  19. | `` |
  20. | |
  21. | |
  22. | |
  23. | |
  24. .======.
  25. ……………………………………………………………………………………
  26.  
  27.       !!!!!
  28.        \\ - - //
  29.        (-● ●-)
  30.        \ (_) /
  31.         \ u /
  32. ┏oOOo-━━━━━━━━┓
  33. ┃           ┃
  34. ┃   耶稣保佑!   ┃
  35. ┃ 永无BUG!!!┃
  36. ┃           ┃
  37. ┗━━━━━━━━-oOOo┛
  38.  
  39. ……………………………………………………………………………………
  40.  
  41. _oo0oo_
  42. 088888880
  43. 88" . "88
  44. (| -_- |)
  45. 0\ = /0
  46. ___/'---'\___
  47. .' \\\\| |// '.
  48. / \\\\||| : |||// \\
  49. /_ ||||| -:- |||||- \\
  50. | | \\\\\\ - /// | |
  51. | \_| ''\---/'' |_/ |
  52. \ .-\__ '-' __/-. /
  53. ___'. .' /--.--\ '. .'___
  54. ."" '< '.___\_<|>_/___.' >' "".
  55. | | : '- \'.;'\ _ /';.'/ - ' : | |
  56. \ \ '_. \_ __\ /__ _/ .-' / /
  57. ====='-.____'.___ \_____/___.-'____.-'=====
  58. '=---='
  59.  
  60. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  61. 佛祖保佑 永无BUG
  62.  
  63. ┌─┐ ┌─┐
  64. ┌──┘ ┴───────┘ ┴──┐
  65. │ │
  66. │ ─── │
  67. │ ─┬┘ └┬─ │
  68. │ │
  69. │ ─┴─ │
  70. │ │
  71. └───┐ ┌───┘
  72. │ │
  73. │ │
  74. │ │
  75. │ └──────────────┐
  76. │ │
  77. │ ├─┐
  78. │ ┌─┘
  79. │ │
  80. └─┐ ┐ ┌───────┬──┐ ┌──┘
  81. │ ─┤ ─┤ │ ─┤ ─┤
  82. └──┴──┘ └──┴──┘
  83. 神兽保佑
  84. 代码无BUG!
  85. '''
  86. # !/usr/bin/python3.4
  87. # -*- coding: utf-8 -*-
  88.  
  89. # 前排烧香
  90. # 永无BUG
  91.  
  92. import requests
  93. import time
  94. import random
  95. import xlsxwriter
  96. from lxml import etree
  97. import urllib.parse
  98. import urllib.request
  99.  
  100. def geturl(url):
  101. # 制作头部
  102. header = {
  103. 'User-Agent': 'Mozilla/5.0 (iPad; U; CPU OS 4_3_4 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8K2 Safari/6533.18.5',
  104. 'Referer': 'https://www.amazon.cn/',
  105. 'Host': 'www.amazon.cn',
  106. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  107. 'Accept-Encoding': 'gzip, deflate, br',
  108. 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
  109. 'Connection': 'keep-alive'
  110. }
  111. # get参数
  112. res = requests.get(url=url, headers=header)
  113. # ('UTF-8')('unicode_escape')('gbk','ignore')
  114. resdata = res.content
  115. return resdata
  116.  
  117. def getimg(url):
  118. # 制作头部
  119. header = {
  120. 'User-Agent': 'Mozilla/5.0 (iPad; U; CPU OS 4_3_4 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8K2 Safari/6533.18.5',
  121. 'Referer': 'https://www.amazon.cn/',
  122. 'Host': 'www.amazon.cn',
  123. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  124. 'Accept-Encoding': 'gzip, deflate, br',
  125. 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
  126. 'Connection': 'keep-alive'
  127. }
  128. # get参数
  129. res = requests.get(url=url, headers=header,stream=True)
  130. # ('UTF-8')('unicode_escape')('gbk','ignore')
  131. resdata = res.iter_content(chunk_size=1024)
  132. for chunk in resdata:
  133. if chunk:
  134. return chunk
  135.  
  136. def begin():
  137. taoyanbai = '''
  138. -----------------------------------------
  139. | 欢迎使用亚马逊爬取系统 |
  140. | 时间:2016年9月20日 |
  141. | 出品:TTyb |
  142. | 微信/QQ:420439007 |
  143. -----------------------------------------
  144. '''
  145. print(taoyanbai)
  146.  
  147. def timetochina(longtime, formats='{}天{}小时{}分钟{}秒'):
  148. day = 0
  149. hour = 0
  150. minutue = 0
  151. second = 0
  152. try:
  153. if longtime > 60:
  154. second = longtime % 60
  155. minutue = longtime // 60
  156. else:
  157. second = longtime
  158. if minutue > 60:
  159. hour = minutue // 60
  160. minutue = minutue % 60
  161. if hour > 24:
  162. day = hour // 24
  163. hour = hour % 24
  164. return formats.format(day, hour, minutue, second)
  165. except:
  166. raise Exception('时间非法')
  167.  
  168. if __name__ == '__main__':
  169.  
  170. begin()
  171.  
  172. keyword = input("请输入关键词:")
  173. try:
  174. sort = int(input("相关度排序请按0,人气排序请按1,上架时间排序请按2,价格低到高排序请按3,价格高到低请按4,用户评分排序请按5(默认相关度排序):"))
  175. if sort > 5 or sort <= 0:
  176. sort = ""
  177. elif sort == 1:
  178. sort = "popularity-rank"
  179. elif sort == 2:
  180. sort = "date-desc-rank"
  181. elif sort == 3:
  182. sort = "price-asc-rank"
  183. elif sort == 4:
  184. sort = "price-desc-rank"
  185. elif sort == 5:
  186. sort = "review-rank"
  187. except:
  188. sort = ""
  189. try:
  190. pages = int(input("请输入抓取页数(默认5页):"))
  191. except:
  192. pages = 5
  193.  
  194. a = time.clock()
  195.  
  196. # 转成字符串
  197. # %y 两位数的年份表示(00 - 99)
  198. # %Y 四位数的年份表示(000 - 9999)
  199. # %m 月份(01 - 12)
  200. # %d 月内中的一天(0 - 31)
  201. # %H 24小时制小时数(0 - 23)
  202. # %I 12小时制小时数(01 - 12)
  203. # %M 分钟数(00 = 59)
  204. # %S 秒(00 - 59)
  205. today = time.strftime('%Y%m%d%H%M', time.localtime())
  206. # 创建一个Excel文件
  207. workbook = xlsxwriter.Workbook('../excel/' + today + '.xlsx')
  208. # 创建一个工作表
  209. worksheet = workbook.add_worksheet()
  210.  
  211. # 第一行参数
  212. first = ['商品名称', '品牌', '详情页网址', '原价格', '星级', '图片','图片网址']
  213.  
  214. # 写入excel计数行
  215. count = 1
  216.  
  217. # 下载图片计数
  218. num = 0
  219.  
  220. # 构造时间戳
  221. nowtime = int(time.time())
  222.  
  223. for page in range(0,pages):
  224.  
  225. urldata = {
  226. 'page':page,
  227. 'sort':sort,
  228. 'keywords':keyword,
  229. 'ie':'UTF-8',
  230. 'qid':str(nowtime)
  231. }
  232. urldata = urllib.parse.urlencode(urldata)
  233. url = "https://www.amazon.cn/s/ref=nb_sb_noss_1?__mk_zh_CN=亚马逊网站&" + urldata
  234.  
  235. html = geturl(url).decode('Utf-8', 'ignore')
  236. #file = open("../data/html.txt","wb")
  237. #file.write(html)
  238. #file.close()
  239.  
  240. #file = open("../data/html.txt","rb")
  241. #html = file.read().decode('Utf-8', 'ignore')
  242. #print(html)
  243.  
  244. # xpath解析需要的东西
  245. contents = etree.HTML(html)
  246.  
  247. # 找到商品名称
  248. titles = contents.xpath('//a[@class="a-link-normal s-access-detail-page a-text-normal"]/@title')
  249. arr_title = []
  250. for title in titles:
  251. arr_title.append(title)
  252.  
  253. # 找到品牌
  254. brands = contents.xpath('//div[@class="a-row a-spacing-mini"][1]/div/span/text()')
  255. arr_brand = []
  256. for brand in brands:
  257. if "更多购买选择" in brand:
  258. pass
  259. else:
  260. arr_brand.append(brand)
  261.  
  262. # 找到详情页网址
  263. detailurls = contents.xpath('//a[@class="a-link-normal s-access-detail-page a-text-normal"]/@href')
  264. arr_detailurl = []
  265. for detailurl in detailurls:
  266. arr_detailurl.append(urllib.parse.unquote(detailurl))
  267. #print(detailurl)
  268. #print(len(arr_detailurl))
  269.  
  270. # 得到原价格
  271. # 这里是忽略了新品价格、非新品价格
  272. prices = contents.xpath('//div[@class="a-row a-spacing-none"][1]/a/span[1]/text()')
  273. arr_price = []
  274. for price in prices:
  275. arr_price.append(price)
  276.  
  277. # 得到星级
  278. grades = contents.xpath('//span[@class="a-icon-alt"]/text()')
  279. arr_grade = []
  280. for grade in grades:
  281. if "平均" in grade:
  282. arr_grade.append(grade)
  283. #print(grade)
  284. else:
  285. pass
  286. if arr_grade:
  287. arr_grade.pop()
  288. #print(len(arr_grades))
  289.  
  290. # 得到图片
  291. imgurls = contents.xpath('//a[@class="a-link-normal a-text-normal"]/img/@src')
  292. arr_img = []
  293.  
  294. for imgurl in imgurls:
  295. file = open("../jpg/" + str(num) + ".jpg","wb")
  296. pic = urllib.request.urlopen(imgurl)
  297. file.write(pic.read())
  298. file.close()
  299. # 每一次下载都暂停1-3秒
  300. imgtime = random.randint(1, 3)
  301. print("下载图片暂停" + str(imgtime) + "秒")
  302. time.sleep(imgtime)
  303. arr_img.append(imgurl)
  304. num = num + 1
  305. #print(imgurl)
  306. #print(len(arr_img))
  307.  
  308. # 写入excel
  309. # 写入第一行
  310. for i in range(0, len(first)):
  311. worksheet.write(0, i, first[i])
  312.  
  313. # 写入其他数据
  314. for j in range(0,len(arr_title)):
  315. worksheet.write(count,0,arr_title[j])
  316. worksheet.write(count, 1, arr_brand[j])
  317. worksheet.write(count, 2, arr_detailurl[j])
  318. try:
  319. worksheet.write(count, 3, arr_price[j])
  320. except Exception as err:
  321. print(err)
  322. worksheet.write(count, 3, "")
  323. worksheet.write(count, 4, arr_grade[j])
  324. worksheet.insert_image(count, 5, "../jpg/" + str(count - 1) + ".jpg")
  325. worksheet.write(count, 6, arr_img[j])
  326. count = count + 1
  327.  
  328. # 每一次下载都暂停5-10秒
  329. loadtime = random.randint(5, 10)
  330. print("抓取网页暂停" + str(loadtime) + "秒")
  331. time.sleep(loadtime)
  332.  
  333. workbook.close()
  334. b = time.clock()
  335. print('运行时间:' + timetochina(b - a))
  336. input('请关闭窗口')

Amazon关键词抓取的更多相关文章

  1. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  2. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

    这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...

  3. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

  4. Anjs分词器以及关键词抓取使用的方法

    首先介绍一下这个网址非常有用本文所有的关于Anjs起源来自这里请先查看一下 https://github.com/NLPchina/ansj_seg 在本次测试使用的是     import java ...

  5. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  6. 如何抓取Amazon大图

    https://www.douban.com/note/277033391/ 進入到日本Amazon看到某些商品有預覽圖可以放大欣賞,當你想要右鍵下載卻發現只得到空白圖或白邊圖.縮圖.切割圖,究竟原圖 ...

  7. R语言XML包的数据抓取

    htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...

  8. 微信朋友圈转疯了(golang写小爬虫抓取朋友圈文章)

    很多人在朋友圈里转发一些文章,标题都是什么转疯啦之类,虽然大多都也是广告啦,我觉得还蛮无聊的,但是的确是有一些文章是非常值得收藏的,比如老婆经常就会收藏一些养生和美容的文章在微信里看. 今天就突发奇想 ...

  9. 百度音乐API抓取

    百度音乐API抓取 前段时间做了一个本地音乐的播放器 github地址,想实现在线播放的功能,于是到处寻找API,很遗憾,不是歌曲不全就是质量不高.在网上发现这么一个APIMRASONG博客,有“获取 ...

随机推荐

  1. Java 解惑:Random 种子的作用、含参与不含参构造函数区别

    Random 通常用来作为随机数生成器,它有两个构造方法: Random random = new Random(); Random random2 = new Random(50); 1.不含参构造 ...

  2. IOS中怎么使用微软雅黑字体

    http://www.cnblogs.com/GnagWang/archive/2011/09/14/2176266.html

  3. 图例解析四大UML关系【转】

    转自http://developer.51cto.com/art/201007/209644.htm 本文和大家重点讨论一下UML关系图,UML中有五类图,共有九种图形,UML类之间的UML关系图你是 ...

  4. Windows Phone,向localdatabase中插入时间数据出现不能转换的错误

    在开发一个小程序时,使用到了DateTime类型的 DBType, 当向数据库中插入一条信息时,报错说是DateTime类型不能转换. 后来发现是系统给我的DateTime类型的列赋予了个初值,而这个 ...

  5. (void*)0 的理解

    例如: #define NULL ((void *)0) 用来定义无效的指针 (void *)0 就是将0强制转化为(void *)类型的指针 char *ch = (void *)0;//ch指向地 ...

  6. 如何让你的Apache支持include文件解析和支持shtml的相关配置

    源地址:http://www.itokit.com/2011/0430/65992.html Apache支持include文件解析shtml首先要应该修改Apache配置文件httpd.conf . ...

  7. Web上下文配置【MvcConfig】

    基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论. 项目说明如下: 1.db.sql是项目中用到的表,数据库使用的是oracle11g ...

  8. Commons-Beanutils包详解

    Commons-Beanutils(一) Commons-Beanutils这个是jakarta commons项目中的一个子项目.这个项目开发的目的是帮助开发者动态的获取/设值Java Bean的属 ...

  9. POJ 3461 裸的KMP

    直接贴代码吧 #include<cstdio> #include<cstring> ],T[]; ]; int n,m; void getfail() { f[] = ; f[ ...

  10. Prim求解最小生成树

    #include "ljjz.h" typedef struct edgedata /*用于保存最小生成树的边类型定义*/ { int beg,en; /*beg,en是边顶点序号 ...