当前位置:   article > 正文

python网络爬虫--爬取淘宝联盟_淘宝联盟数据爬取怎么弄

淘宝联盟数据爬取怎么弄

互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码经过浏览器解析、渲染,将丰富多彩的网页呈现我们眼前。

网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是全球统一资源定位符URL,用来定义互联网上一个唯一的资源 例如:一张图片、一个文件、一段视频都可以用url唯一确定。

爬虫的基本流程:

  1. 发送请求

  2. 获得响应内容

  3. 解析内容

  4. 保存数据

爬虫所需的工具:

    1. 请求库:requests,selenium(可以驱动浏览器解析渲染CSS和JS,但有性能劣势(有用没用的网页都会加载))
    2.  解析库:正则,xpath,beautifulsoup,pyquery
    3.  存储库:文件,MySQL,Mongodb,Redis

下面实现一个爬虫,爬取符合条件的淘宝联盟网站的商品。

1. URL分析

     我们首先打开淘宝联盟网址,在搜索栏随便输入一件 商品,比如“鞋子”

2. 按F12可以查看访问当前网页发送的所有请求 

现在发现没东西,因为有的网站是动态加载的,当我们下拉滚动条时,看到有如下请求:

然后点击下一页,有 下面的请求:

URL:http://pub.alimama.com/items/search.json?q=%E9%9E%8B%E5%AD%90&_t=1531837246570&toPage=2&perPageSize=50&auctionTag=&shopTag=yxjh&t=1531837861744&_tb_token_=58efe1f76686e&pvid=10_218.88.24.143_1018_1531837246340

通过分析这就是我们所要请求的URL。

3. 请求头

User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户host;

cookies:cookie用来保存登录信息

注意: 一般做爬虫都会加上请求头

请求头需要注意的参数:

(1)Referrer:访问源至哪里来(一些大型网站,会通过Referrer 做防盗链策略;所有爬虫也要注意模拟)

(2)User-Agent:访问的浏览器(要加上否则会被当成爬虫程序)

(3)cookie:请求头注意携带

4、请求体

  1. 如果是get方式,请求体没有内容 (get请求的请求体放在 url后面参数中,直接能看到)
  2. 如果是post方式,请求体是format data
  3. ps:
  4. 1、登录窗口,文件上传等,信息都会被附加到请求体内
  5. 2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

5、响应状态码

  200:代表成功

  301:代表跳转

  404:文件不存在

  403:无权限访问

  502:服务器错误

2. 请求并获取响应

我们通过不同的方式来分别请求并获取响应,具体实现如下:

1.url请求,获取响应的json数据,并将json数据转换成dict 采用 urllib2 实现 

  1. #url请求,获取响应的json数据,并将json数据转换成dict 采用 urllib2 实现
  2. def getJSONText(url):
  3. try:
  4. page = urllib2.urlopen(url)
  5. data = page.read()
  6. #print (data)
  7. #print (type(data))
  8. #dict_data = json.loads(data)
  9. dict_data = demjson.decode(data)
  10. #print dict_data
  11. #print type(dict_data)
  12. return dict_data
  13. except:
  14. return ""

2.#url请求,获取响应的json数据,并将json数据转换成dict 采用 添加请求头、设置代理的方式 实现

  1. #url请求,获取响应的json数据,并将json数据转换成dict 采用 添加请求头、设置代理的方式 实现
  2. def getJSONText2(url):
  3. try:
  4. proxies = {
  5. "http": "http://221.10.159.234:1337",
  6. "https": "https://60.255.186.169:8888",
  7. }
  8. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
  9. data = requests.get(url, headers=headers,proxies=proxies).text
  10. print (data)
  11. print (type(data))
  12. # dict_data = json.loads(data)
  13. dict_data = demjson.decode(data)
  14. print dict_data
  15. print type(dict_data)
  16. return dict_data
  17. except:
  18. return "" 

3.采用selenium实现 

  1. #url请求,获取响应的json数据,并将json数据转换成dict 采用selenium实现
  2. def get_browser_text(url):
  3. #browser = webdriver.Chrome(executable_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe")
  4. browser = webdriver.Firefox(executable_path="C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe")
  5. try:
  6. browser.get(url)
  7. print(browser.page_source)
  8. browserdata = browser.page_source
  9. browser.close()
  10. # res = r'<a .*?>(.*?)</a>'
  11. res = r'<pre .*?>(.*?)</pre>'
  12. json_data = re.findall(res, browserdata, re.S | re.M)
  13. print json_data
  14. for value in json_data:
  15. print value
  16. dict_data = demjson.decode(json_data)
  17. print 'dict_data:'
  18. print dict_data
  19. # print type(dict_data)
  20. return dict_data
  21. except:
  22. return ""

4.

  1. # 获取单个商品的HTML代码并用正则匹配出描述、服务、物流3项参数 采用urllib2
  2. def getHTMLText(url):
  3. try:
  4. data = urllib2.urlopen(url).read()
  5. res = r'<dd class="tb-rate-(.*?)"'
  6. data_list = re.findall(res, data, re.S | re.M)
  7. print type(data_list)
  8. print data_list[0]
  9. #for value in mm:
  10. # print value
  11. return data_list
  12. except:
  13. return ""

3. 爬虫完整代码如下:

  1. #coding=utf-8
  2. __author__ = 'yansong'
  3. # 2018.07.12
  4. # 抓取淘宝联盟 比率>10 ,描述、服务、物流3项参数高于或持平于同行业的商品图片。
  5. import json
  6. import demjson
  7. import urllib2
  8. import os
  9. import time
  10. import requests
  11. import re
  12. from selenium import webdriver
  13. from selenium.webdriver.common.by import By
  14. from selenium.webdriver.common.keys import Keys
  15. from selenium.webdriver.support import expected_conditions as EC
  16. from selenium.webdriver.support.wait import WebDriverWait
  17. import sys
  18. reload(sys)
  19. sys.setdefaultencoding('utf8')
  20. path_name = u'T恤宽松日系男款' #图片保存的文件夹名称
  21. Myname = u'T恤宽松日系男款' #搜索关键字
  22. # 创建文件夹
  23. path = os.getcwd() # 获取此脚本所在目录
  24. new_path = os.path.join(path,path_name)
  25. if not os.path.isdir(new_path):
  26. os.mkdir(new_path)
  27. #url请求,获取响应的json数据,并将json数据转换成dict 采用selenium实现
  28. def get_browser_text(url):
  29. #browser = webdriver.Chrome(executable_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe")
  30. browser = webdriver.Firefox(executable_path="C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe")
  31. try:
  32. browser.get(url)
  33. print(browser.page_source)
  34. browserdata = browser.page_source
  35. browser.close()
  36. # res = r'<a .*?>(.*?)</a>'
  37. res = r'<pre .*?>(.*?)</pre>'
  38. json_data = re.findall(res, browserdata, re.S | re.M)
  39. print json_data
  40. for value in json_data:
  41. print value
  42. dict_data = demjson.decode(json_data)
  43. print 'dict_data:'
  44. print dict_data
  45. # print type(dict_data)
  46. return dict_data
  47. except:
  48. return ""
  49. #url请求,获取响应的json数据,并将json数据转换成dict 采用 urllib2 实现
  50. def getJSONText(url):
  51. try:
  52. page = urllib2.urlopen(url)
  53. data = page.read()
  54. #print (data)
  55. #print (type(data))
  56. #dict_data = json.loads(data)
  57. dict_data = demjson.decode(data)
  58. #print dict_data
  59. #print type(dict_data)
  60. return dict_data
  61. except:
  62. return ""
  63. # 获取单个商品的HTML代码并用正则匹配出描述、服务、物流3项参数 采用urllib2
  64. def getHTMLText(url):
  65. try:
  66. data = urllib2.urlopen(url).read()
  67. res = r'<dd class="tb-rate-(.*?)"'
  68. data_list = re.findall(res, data, re.S | re.M)
  69. print type(data_list)
  70. print data_list[0]
  71. #for value in mm:
  72. # print value
  73. return data_list
  74. except:
  75. return ""
  76. #url请求,获取响应的json数据,并将json数据转换成dict 采用 添加请求头、设置代理的方式 实现
  77. def getJSONText2(url):
  78. try:
  79. proxies = {
  80. "http": "http://221.10.159.234:1337",
  81. "https": "https://60.255.186.169:8888",
  82. }
  83. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
  84. data = requests.get(url, headers=headers,proxies=proxies).text
  85. print (data)
  86. print (type(data))
  87. # dict_data = json.loads(data)
  88. dict_data = demjson.decode(data)
  89. print dict_data
  90. print type(dict_data)
  91. return dict_data
  92. except:
  93. return ""
  94. def getJSONText3(url):
  95. try:
  96. driver = webdriver.Chrome(executable_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe")
  97. driver.get(url) # 访问淘宝宝贝页面,获取cookie
  98. # driver.get(taobao_comment_url) # 直接访问宝贝评论会被反爬虫检测到。上一步获得cookie后可得到评论数据
  99. print(driver.find_element_by_xpath('/html/body').text)
  100. data = driver.find_element_by_xpath('/html/body').text
  101. #data = requests.get(url, headers=headers,proxies=proxies).text
  102. print (data)
  103. print (type(data))
  104. # dict_data = json.loads(data)
  105. dict_data = demjson.decode(data)
  106. print dict_data
  107. print type(dict_data)
  108. return dict_data
  109. except:
  110. return ""
  111. def mytaobao_spider():
  112. # 每一页的url 循环抓取60页
  113. for page in range(0, 60):
  114. url = (
  115. 'http://pub.alimama.com/items/search.json?q=%s&_t=1531556288035&toPage=%d&perPageSize=50&auctionTag=&shopTag=yxjh&t=1531556427336&_tb_token_=7e73deef30e18&pvid=10_117.136.70.61_599_1531556285246' % (
  116. Myname, page))
  117. # url = ('http://pub.alimama.com/items/channel/qqhd.json?q=%s&channel=qqhd&_t=1531121449018&toPage=%d&perPageSize=50&shopTag=&t=1531125125414&_tb_token_=eeee6ee3be688&pvid=19_118.112.188.32_688_1531125125232'%(Myname,page))
  118. # url = ('http://pub.alimama.com/items/search.json?q=%E9%9E%8B%E5%AD%90&_t=1531368912715&auctionTag=&perPageSize=50&shopTag=yxjh&t=1531368913289&_tb_token_=e370663ebef17&pvid=10_118.112.188.32_9532_1531368912863')
  119. print url
  120. time.sleep(2) # 延时2秒,添加延时操作是因为淘宝有反爬虫机制,过于频繁的访问IP可能会被限制
  121. url_data = getJSONText(url)
  122. # 一页中每件商品的标签信息
  123. for i in range(0, 50):
  124. time.sleep(1)
  125. try:
  126. # print type(url_data['data']['pageList'][i]['pictUrl'])
  127. pictUrl = url_data['data']['pageList'][i]['pictUrl'] # 图片url
  128. sellerId = url_data['data']['pageList'][i]['sellerId'] # 商品id
  129. auctionUrl = url_data['data']['pageList'][i]['auctionUrl'] # 淘宝链接
  130. auctionId = url_data['data']['pageList'][i][
  131. 'auctionId'] # 淘宝链接 = 'http://item.taobao.com/item.htm?id=%d'%(auctionId)
  132. tkRate = url_data['data']['pageList'][i]['tkRate'] # 比率
  133. zkPrice = url_data['data']['pageList'][i]['zkPrice'] # 价格
  134. # 需要抓取比率大于10.00的商品信息
  135. if tkRate > 10.00:
  136. # time.sleep(1)
  137. # print '详细信息:'
  138. # print type(tkRate)
  139. # print type(zkPrice)
  140. # print '比率:%f' % (tkRate)
  141. # print '价格:%f' % (zkPrice)
  142. # print sellerId
  143. # print auctionId
  144. # print pictUrl
  145. # print auctionUrl # 淘宝链接
  146. # print type(sellerId)
  147. print auctionUrl
  148. # 每件商品的子url (描述相符、发货速度、服务态度 等信息)
  149. # sub_url = ('http://pub.alimama.com/pubauc/searchPromotionInfo.json?oriMemberId=%d&blockId=&t=1531369204612&_tb_token_=e370663ebef17&pvid=10_118.112.188.32_760_1531368931581' % (sellerId))
  150. sub_url = auctionUrl # 每件商品的淘宝url
  151. sub_url_data = getHTMLText(sub_url) # 获取店铺的 描述、服务、物流 信息
  152. print type(sub_url_data)
  153. print len(sub_url_data)
  154. # 如果返回的是空字符串, 则说明没有取到我们想要的字段,是因为淘宝有不同的页面,对于这种页面我们需要进一步分析下面的url
  155. if (len(sub_url_data) == 0):
  156. info_url = ('https://world.taobao.com/item/%d.htm' % (auctionId))
  157. info_data = urllib2.urlopen(info_url).read()
  158. res_info = r'<li class="([^s].*?)<img'
  159. tmp_url_data = re.findall(res_info, info_data, re.S | re.M)
  160. print "tmp_url_data:"
  161. for value1 in tmp_url_data:
  162. print value1
  163. sub_url_data = []
  164. score_list = [x[0:4] for x in tmp_url_data] # 截取前面5位
  165. print 'new_list:'
  166. for score in score_list:
  167. print score
  168. if score == 'down':
  169. score = 'lower' # d第一种页面与第二种页面返回的店铺评定信息不同,需转换成统一的方便后面处理,将 down 转换为 lower
  170. sub_url_data.append(score)
  171. print '替换后的list元素:'
  172. for level_data in sub_url_data:
  173. print level_data
  174. # 如果3项评定参数都不是‘lower’ 就将图片和相关信息抓取出来 任意一项参数为‘lower’都不符合要求
  175. if ((not (sub_url_data[0] == 'lower')) and (not (sub_url_data[1] == 'lower')) and (
  176. not (sub_url_data[2] == 'lower'))):
  177. # for value in sub_url_data:
  178. # print value
  179. mypictUrl = 'http:' + pictUrl # 图片url
  180. picture_content = urllib2.urlopen(mypictUrl).read()
  181. picture_name = auctionUrl + '.jpg' # 拼接图片名称
  182. print picture_name
  183. time.sleep(1)
  184. # 需要写入文件的信息
  185. spider_info = 'url:' + url + '\n' + ' sub_url:' + sub_url + '\n' + ' 淘宝链接:' + auctionUrl + '\n' + ' mypictUrl:' + mypictUrl + '\n\n'
  186. try:
  187. # 写图片
  188. index_num = picture_name.index('id=')
  189. with open(path_name + '/' + picture_name[index_num:], 'wb') as code:
  190. code.write(picture_content)
  191. # 写URL信息
  192. with open(path_name + '/' + 'spider.txt', 'a') as spider_code:
  193. spider_code.write(spider_info)
  194. except (IOError, ZeroDivisionError), e:
  195. print e
  196. print "Error: 没有找到图片文件或读取文件失败"
  197. else:
  198. print "图片写入成功"
  199. time.sleep(1)
  200. except (IndexError, KeyError, TypeError), e:
  201. print e
  202. print "每件商品信息读取失败"
  203. else:
  204. pass
  205. # print "每件商品的标签信息读取成功"
  206. if __name__ == '__main__':
  207. mytaobao_spider()

4. 运行效果

抓取的图片在指定的目录下:

同时写了一个spider.txt文件,里面是详细的URL信息:

单个商品的淘宝链接如:http://item.taobao.com/item.htm?id=566676904510

淘宝链接构成: http://item.taobao.com/item.htm?+id=566676904510    抓取的图片名称是以商品的id来命名的,我们根据图片就可以快速找到该商品,该爬虫抓取的都是  比率>10 ,描述、服务、物流3项参数高于或持平于同行业的商品,也可以根据自己需要,抓取价格、销售量等符合自己要求的商品。

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/159418
推荐阅读
相关标签
  

闽ICP备14008679号