Python爬虫 -- 淘宝商品比价

一、功能描述

Python爬虫 -- 淘宝商品比价_第1张图片
1、目标: 获取淘宝搜索页面的信息,提取其中的商品名称和价格

2、理解:

  • 淘宝搜索接口的 URL
  • 商品翻页的处理

关键词:Aj1

第 1 页: https://s.taobao.com/search?q=Aj1&bcoffset=6&ntoffset=6&p4ppushleft=1%2C48&s=0

第 2 页: https://s.taobao.com/search?q=Aj1&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44

第 3 页: https://s.taobao.com/search?q=Aj1&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88

3、技术路线: requests, bs4, re

  • 不采用BeautifulSoup库,使用正则表达式库直接在网页源码中提取关键信息

4、分析可行性

查看淘宝网 robots协议:https://s.taobao.com/robots.txt

User-agent: *
Disallow: /

也就是说所有信息都不能爬取,但是作为学习爬虫用,以类人的方式还是可以爬的,也就是我们不会对淘宝网的服务器造成影响。爬虫有风险,爬时需谨慎,不能不加限制的爬取有协议限制的网站。

5、程序的结构设计

  • getHTMLText():提交商品搜索请求,循环获取页面
  • parsePage():对于每个页面,提取商品名称和价格信息
  • printGoodsList():将信息输出到屏幕上

二、爬虫源码

import requests
import re

def getHTMLText(url):
    kv = {'cookie':'thw=cn; v=0; t=ab66dffdedcb481f77fd563809639584; cookie2=1f14e41c704ef58f8b66ff509d0d122e; _tb_token_=5e6bed8635536; cna=fGOnFZvieDECAXWIVi96eKju; unb=1864721683; sg=%E4%B8%8B3f; _l_g_=Ug%3D%3D; skt=83871ef3b7a49a0f; cookie1=BqeGegkL%2BLUif2jpoUcc6t6Ogy0RFtJuYXR4VHB7W0A%3D; csg=3f233d33; uc3=vt3=F8dBy3%2F50cpZbAursCI%3D&id2=UondEBnuqeCnfA%3D%3D&nk2=u%2F5wdRaOPk21wDx%2F&lg2=VFC%2FuZ9ayeYq2g%3D%3D; existShop=MTU2MjUyMzkyMw%3D%3D; tracknick=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; lgc=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; _cc_=WqG3DMC9EA%3D%3D; dnk=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; _nk_=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; cookie17=UondEBnuqeCnfA%3D%3D; tg=0; enc=2GbbFv3joWCJmxVZNFLPuxUUDA7QTpES2D5NF0D6T1EIvSUqKbx15CNrsn7nR9g%2Fz8gPUYbZEI95bhHG8M9pwA%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=32_1; alitrackid=www.taobao.com; lastalitrackid=www.taobao.com; swfstore=97213; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; uc1=cookie16=UtASsssmPlP%2Ff1IHDsDaPRu%2BPw%3D%3D&cookie21=UIHiLt3xThH8t7YQouiW&cookie15=URm48syIIVrSKA%3D%3D&existShop=false&pas=0&cookie14=UoTaGqj%2FcX1yKw%3D%3D&tag=8&lng=zh_CN; JSESSIONID=A502D8EDDCE7B58F15F170380A767027; isg=BMnJJFqj8FrUHowu4yKyNXcd2PXjvpa98f4aQWs-RbDvsunEs2bNGLfj8BYE6lWA; l=cBTDZx2mqxnxDRr0BOCanurza77OSIRYYuPzaNbMi_5dd6T114_OkmrjfF96VjWdO2LB4G2npwJ9-etkZ1QoqpJRWkvP.; whl=-1%260%260%261562528831082',
          'user-agent':'Mozilla/5.0'}
    try:
        r = requests.get(url, headers=kv, timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[i].split(':')[1])
            ilt.append([price, title])
    except:
        print("")

def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    print(tplt.format("序号", "价格", "商品名称"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1]))

def main():
    goods = 'Aj1'
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(44 * i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
        printGoodsList(infoList)
main()

输出信息:

============= RESTART: C:/Users/yong/Desktop/CrowTaobaoPrice.py =============
序号  	价格      	商品名称            
   1	138.00  	aj1男鞋空军一号高帮内增高鞋男10cm潮鞋
   2	969.00  	Jordan 官方 AIR JORDAN 1 MID SE GC AJ1男子运动鞋 CD6759
   3	529.00  	Jordan官方AIR JORDAN 1 RET LOW SLIP AJ1女子运动鞋低帮AV3918
   4	999.00  	Jordan官方 AIR JORDAN 1 MID SE AJ1男子运动鞋 852542
   5	529.00  	Jordan官方AIR JORDAN 1 RET LOW SLIP AJ1女子运动鞋低帮AV3918
   6	749.00  	AIR JORDAN 1 MID AJ1 黑水泥 黑白 男中帮运动篮球鞋554724-060
   7	820.47  	Air Jordan 1 Mid GS aj1 白红 小芝加哥 中帮篮球鞋- 554725 116
   8	1069.00 	Nike耐克男鞋2018冬新款运动休闲AJ1全白色运动篮球鞋554724-104
   9	1099.00 	Nike女鞋AIR JORDAN 1 AJ1樱木花道乔1情人节休篮球鞋555112-661
  10	1099.00 	Nike Air Jordan 1 尼克斯蓝橙AJ1男女高帮休闲篮球鞋 AH7389-408
  11	749.00  	耐克NIKE AIR JORDAN 1 MID AJ1 男女TOP3小扣碎篮球鞋554724-124
  12	896.88  	Air Jordan 1 Low Black Toe aj1男鞋 黑脚趾 篮球鞋- 553558 116
  13	579.00  	NIKE AIR JORDAN 1 LOW AJ1乔1男子黑脚趾运动篮球鞋 553558-116
  14	739.00  	Nike男鞋Air Jordan 1乔1纯白AJ1鸳鸯高帮休闲篮球鞋554724-124
  15	549.00  	NIKE AIR JORDAN 1 AJ1女黑脚趾运动休闲篮球鞋553560-116/554723
  16	899.00  	Air Jordan 1 Mid  AJ1 中帮男子绒面黑白篮球鞋运动鞋554724-060
  17	599.00  	Jordan 官方 AIR JORDAN 1 LOW AJ1大童运动童鞋低帮553560
  18	1099.00 	Nike女鞋AIR JORDAN 1 AJ1樱木花道乔1情人节休篮球鞋555112-661
  19	859.00  	耐克男鞋Air Jordan 1 Low AJ1凯尔特人黑绿脚趾篮球鞋553558-113
  20	549.00  	NIKE AIR JORDAN 1 LOW GS AJ1 女时尚百搭低帮休闲鞋553560-101
  21	839.00  	NIKE W AIR JORDAN 1 REBEL XX AJ1变革女运动篮球鞋 AR5599-201
  22	899.00  	Air Jordan 1 Mid AJ1 李小龙出租车黑黄小新欢篮球鞋 554724-700
  23	649.00  	Nike/耐克正品男鞋Nike Air Jordan AJ1乔1高帮运动篮球鞋554724
  24	159.00  	AJ1高帮鞋男韩版潮流百搭板鞋夏季鞋子男潮鞋高邦嘻哈运动休闲鞋
  25	799.00  	Jordan 官方 AIR JORDAN 1 MID (GS)  AJ1大童运动童鞋555112
  26	529.00  	NIKE耐克女鞋2019新款AIR JORDAN aj1复刻轻便运动鞋休闲鞋AH7232
  27	249.00  	李宁板鞋高帮休闲鞋2019夏秋透气AJ1耐磨防滑魔术贴滑板鞋运动鞋
  28	179.00  	乔丹男鞋高帮板鞋夏季新款休闲鞋透气小白鞋运动鞋男aj1小闪电
  29	269.00  	森马男鞋高帮男士嘻哈潮鞋子男高邦运动休闲鞋韩版百搭aj1板鞋男
  30	138.00  	袜子鞋男网面透气休闲男鞋夏季透气网鞋男士小白运动潮鞋aj1男鞋
  31	368.00  	AJ1黑红脚趾男鞋蒂芙尼篮球鞋乔1小闪电北卡蓝联名女鞋兔八哥板鞋
  32	158.00  	aj1男鞋夏季2019新款空军一号怒吼天尊高帮鞋百搭运动休闲鞋潮鞋
  33	921.00  	Air Jordan 1 Retro High AJ1男鞋 时尚复刻篮球鞋 aq7924-101
  34	158.00  	空军一号夏季新款潮鞋aj1高帮篮球鞋潮流个性网红同款高邦袜子鞋

三、爬虫总结

在第一次爬的时候失败了,后来在网上找博客,很多网站设置了反爬虫机制,所以我们需要伪装成用户去访问淘宝,绕过淘宝的反爬虫,由于是爬虫新手,没有高明的方法,就参照了淘宝反爬虫机制解决小办法这篇博客设置 cookie 暂时解决了这个问题,以后学到好的方法再改进。

设置方法: 登录到淘宝页面,打开开发者模式,我用的是 Chrome 浏览器,找到 cookie 和 user-agent,(如果看不到,可刷新浏览器)将信息添加到代码中,然后重新运行,即可爬取成功。
Python爬虫 -- 淘宝商品比价_第2张图片

你可能感兴趣的:(Python爬虫)