Task 02 re(2.3)

2.3 学习正则表达式 re

2.3.1 为什么使用正则表达式?

典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。

通过使用正则表达式,可以:

- 测试字符串内的模式。
    例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
- 替换文本。
    可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
- 基于模式匹配从字符串中提取子字符串。
    可以查找文档内或输入域内特定的文本。

可以使用正则表达式来搜索和替换标记。

使用正则表达式的优势是什么? 简洁

  • 正则表达式是用来简洁表达一组字符串的表达式
  • 正则表达式是一种通用的字符串表达框架
  • 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具
  • 正则表达式可以用来判断某字符串的特征归属

正则表达式在文本处理中十分常用:

  • 同时查找或替换一组字符串
  • 匹配字符串的全部或部分(主要)

2.3.2 正则表达式语法

正则表达式语法由字符和操作符构成:

  • 常用操作符
    • . 表示任何单个字符

    • [ ] 字符集,对单个字符给出取值范围 ,如[abc]表示a、b、c,[a‐z]表示a到z单个字符

    • [^ ] 非字符集,对单个字符给出排除范围 ,如[^abc]表示非a或b或c的单个字符

    • * 前一个字符0次或无限次扩展,如abc* 表示 ab、abc、abcc、abccc等

    • + 前一个字符1次或无限次扩展 ,如abc+ 表示 abc、abcc、abccc等

    • ? 前一个字符0次或1次扩展 ,如abc? 表示 ab、abc

    • | 左右表达式任意一个 ,如abc|def 表示 abc、def

    • {m} 扩展前一个字符m次 ,如ab{2}c表示abbc

    • {m,n} 扩展前一个字符m至n次(含n) ,如ab{1,2}c表示abc、abbc

    • ^ 匹配字符串开头 ,如^abc表示abc且在一个字符串的开头

    • $ 匹配字符串结尾 ,如abc$表示abc且在一个字符串的结尾

    • ( ) 分组标记,内部只能使用 | 操作符 ,如(abc)表示abc,(abc|def)表示abc、def

    • \d 数字,等价于[0‐9]

    • \w 单词字符,等价于[A‐Za‐z0‐9_]

2.3.3 正则表达式re库的使用

  • 调用方式:import re
  • re库采用raw string类型表示正则表达式,表示为:r’text’,raw string是不包含对转义符再次转义的字符串;

re库的主要功能函数:

  • re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
    • re.search(pattern, string, flags=0)
  • re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
    • re.match(pattern, string, flags=0)
  • re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
    • re.findall(pattern, string, flags=0)
  • re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
    • re.split(pattern, string, maxsplit=0, flags=0)
  • re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
    • re.finditer(pattern, string, flags=0)
  • re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
    • re.sub(pattern, repl, string, count=0, flags=0)

    • flags : 正则表达式使用时的控制标记:

      • re.I --> re.IGNORECASE : 忽略正则表达式的大小写,[A‐Z]能够匹配小写字符
      • re.M --> re.MULTILINE : 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
      • re.S --> re.DOTALL : 正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符

re库的另一种等价用法(编译)

  • regex = re.compile(pattern, flags=0):将正则表达式的字符串形式编译成正则表达式对象

re 库的贪婪匹配和最小匹配

  • .* Re库默认采用贪婪匹配,即输出匹配最长的子串
  • *? 只要长度输出可能不同的,都可以通过在操作符后增加?变成最小匹配

2.3.4 实战:淘宝商品比价定向爬虫

  • 爬取网址:https://s.taobao.com/search?q=书包&js=1&stats_click=search_radio_all%25
  • 爬取思路:
    1. 提交商品搜索请求,循环获取页面
    2. 对于每个页面,提取商品名称和价格信息
    3. 将信息输出到屏幕上
# 导入包
import requests
import re
# import requests
# import re

1. 提交商品搜索请求,循环获取页面

def getHTMLText(url):
    """
    请求获取html,(字符串)
    :param url: 爬取网址
    :return: 字符串
    """
    try:
        # 添加头信息,
        kv = {
            'cookie': '_samesite_flag_=true; cookie2=195dff0324895b700ba634018a2ac64e; t=6bbdbc591d36d67778340ef719afc85c; _tb_token_=eb63db08164ee; cna=9dQpF7ahfAQCAd9OzfM8zmTS; sgcookie=EKhPCohfwHt5Dg2zgQ09w; unb=3988658748; uc3=id2=UNk%2FQP%2B50d7yBA%3D%3D&lg2=W5iHLLyFOGW7aA%3D%3D&vt3=F8dBxGR00G4Vq8iN838%3D&nk2=F5RGMONYP9KxERo%3D; csg=c55d9bd9; lgc=tb364519060; cookie17=UNk%2FQP%2B50d7yBA%3D%3D; dnk=tb364519060; skt=f3a74c6461da5d67; existShop=MTU4NzczNDQxNQ%3D%3D; uc4=nk4=0%40FY4NBfuSRJNW4XqsCry%2B3TpKGY0MKg%3D%3D&id4=0%40Ug41QXQdvkTdsMbGD9g6QMnhzVJ5; tracknick=tb364519060; _cc_=V32FPkk%2Fhw%3D%3D; _l_g_=Ug%3D%3D; sg=083; _nk_=tb364519060; cookie1=VWYsqwEgWtu8l0Q758GIDYbsNwhhNFtpRArXKgAwLSs%3D; enc=A05bLdQMTOJv1LJ%2FYSTWgRjCt3xrLShv3Tavb4MOA%2FQ8vHAqk5KThAlASw%2BPty4uWQcMFeWzcDzwbtjitS%2B%2FDA%3D%3D; tfstk=cbUdBFiQAOXnz4NE0zIiPsExUbJRa4RKEBMJy_98QXVDYLYpRsbzorEjmMGypVCO.; hng=CN%7Czh-CN%7CCNY%7C156; uc1=cookie16=Vq8l%2BKCLySLZMFWHxqs8fwqnEw%3D%3D&cookie21=W5iHLLyFe3xm&cookie15=VT5L2FSpMGV7TQ%3D%3D&existShop=false&pas=0&cookie14=UoTUPcvNkROvRg%3D%3D; mt=ci=63_1; v=0; thw=cn; JSESSIONID=5F754971566500914381AE6D65E5F002; isg=BDMz5_5caXiW1SWsM_XUTXjGwjddaMcqJ-Pv3eXQ4dKJ5FKGbDv3etWymhQKxB8i; l=eBrzUkaVQ-AOu1eFBOfwnurza77OhIRfguPzaNbMiT5PODfp5jXfWZj4NzL9CnGVH6PBJ3JMwUX8BJYN0yhqJxpsw3k_J_fj3dC..',
            'user-agent': 'Mozilla/5.0'
        }
        r = requests.get(url, timeout=30, headers=kv)
        # r = requests.get(url, timeout=30)
        # print(r.status_code)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "爬取失败"

def getHTMLText(url):
    kv = {
            'cookie': '_samesite_flag_=true; cookie2=195dff0324895b700ba634018a2ac64e; t=6bbdbc591d36d67778340ef719afc85c; _tb_token_=eb63db08164ee; cna=9dQpF7ahfAQCAd9OzfM8zmTS; sgcookie=EKhPCohfwHt5Dg2zgQ09w; unb=3988658748; uc3=id2=UNk%2FQP%2B50d7yBA%3D%3D&lg2=W5iHLLyFOGW7aA%3D%3D&vt3=F8dBxGR00G4Vq8iN838%3D&nk2=F5RGMONYP9KxERo%3D; csg=c55d9bd9; lgc=tb364519060; cookie17=UNk%2FQP%2B50d7yBA%3D%3D; dnk=tb364519060; skt=f3a74c6461da5d67; existShop=MTU4NzczNDQxNQ%3D%3D; uc4=nk4=0%40FY4NBfuSRJNW4XqsCry%2B3TpKGY0MKg%3D%3D&id4=0%40Ug41QXQdvkTdsMbGD9g6QMnhzVJ5; tracknick=tb364519060; _cc_=V32FPkk%2Fhw%3D%3D; _l_g_=Ug%3D%3D; sg=083; _nk_=tb364519060; cookie1=VWYsqwEgWtu8l0Q758GIDYbsNwhhNFtpRArXKgAwLSs%3D; enc=A05bLdQMTOJv1LJ%2FYSTWgRjCt3xrLShv3Tavb4MOA%2FQ8vHAqk5KThAlASw%2BPty4uWQcMFeWzcDzwbtjitS%2B%2FDA%3D%3D; tfstk=cbUdBFiQAOXnz4NE0zIiPsExUbJRa4RKEBMJy_98QXVDYLYpRsbzorEjmMGypVCO.; hng=CN%7Czh-CN%7CCNY%7C156; uc1=cookie16=Vq8l%2BKCLySLZMFWHxqs8fwqnEw%3D%3D&cookie21=W5iHLLyFe3xm&cookie15=VT5L2FSpMGV7TQ%3D%3D&existShop=false&pas=0&cookie14=UoTUPcvNkROvRg%3D%3D; mt=ci=63_1; v=0; thw=cn; JSESSIONID=5F754971566500914381AE6D65E5F002; isg=BDMz5_5caXiW1SWsM_XUTXjGwjddaMcqJ-Pv3eXQ4dKJ5FKGbDv3etWymhQKxB8i; l=eBrzUkaVQ-AOu1eFBOfwnurza77OhIRfguPzaNbMiT5PODfp5jXfWZj4NzL9CnGVH6PBJ3JMwUX8BJYN0yhqJxpsw3k_J_fj3dC..',
            'user-agent': 'Mozilla/5.0'
        }
    r = requests.get(url, timeout=30, headers=kv)
    # r = requests.get(url, timeout=30)
    # print(r.status_code)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    return r.text

2. 对于每个页面,提取商品名称和价格信息

def parsePage(glist, html):
    '''
    解析网页,搜索需要的信息
    :param glist: 列表作为存储容器
    :param html: 由getHTMLText()得到的
    :return: 商品信息的列表
    '''
    try:
        # 使用正则表达式提取信息
        price_list = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        name_list = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(len(price_list)):
            price = eval(price_list[i].split(":")[1])  #eval()在此可以去掉""
            name = eval(name_list[i].split(":")[1])
            glist.append([price, name])
    except:
        print("解析失败")
def parsePage(glist, html):
    # 使用正则表达式提取信息
    price_list = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
    name_list = re.findall(r'\"raw_title\"\:\".*?\"', html)
    for i in range(len(price_list)):
        price = eval(price_list[i].split(":")[1])  #eval()在此可以去掉""
        name = eval(name_list[i].split(":")[1])
        glist.append([price, name])

3. 将信息输出到屏幕上

def printGoodList(glist):
    tplt = "{0:^4}\t{1:^6}\t{2:^10}"
    print(tplt.format("序号", "商品价格", "商品名称"))
    count = 0
    for g in glist:
        count = count + 1
        print(tplt.format(count, g[0], g[1]))
# 根据页面url的变化寻找规律,构建爬取url
goods_name = "书包"  # 搜索商品类型
start_url = "https://s.taobao.com/search?q=" + goods_name
info_list = []
page = 3  # 爬取页面数量
count = 0
for i in range(page):
    count += 1
    try:
        url = start_url + "&s=" + str(44 * i)
        html = getHTMLText(url)  # 爬取url
        parsePage(info_list, html) #解析HTML和爬取内容
        print("\r爬取页面当前进度: {:.2f}%".format(count * 100 / page), end="")  # 显示进度条
    except:
        continue
爬取页面当前进度: 100.00%
printGoodList(info_list)
 序号 	 商品价格 	   商品名称   
 1  	139.00	双肩包男书包中学生时尚潮流女初中生男背包
 2  	59.00 	双肩包男士大容量旅行电脑背包时尚潮流高中初中学生书包女小学生
 3  	149.00	鳄鱼男士双肩包商务休闲电脑帆布背包旅游旅行包时尚潮流学生书包
 4  	279.00	Jordan 官方 AIR JORDAN 双肩包 书包背包
 CW7699
 5  	288.00	【新品】JanSport杰斯伯双肩包女学生书包男背包运动休闲背包4QUT
 6  	99.90 	迪卡侬户外双肩背包男女休闲双肩包运动学生小书包轻便10L QUBP
 7  	899.00	【买1送1】Fion/菲安妮大牌双肩包女 2020新款印花背包旅行书包
 8  	175.00	不莱玫迪士尼合作款书包女韩版高中百搭ins双肩包时尚可爱小背包
 9  	398.00	安踏中国对背包男潮牌2020春季新款大容量书包学生旅行运动双肩包
 10 	689.00	背包双肩包男士商务旅行背包防盗电脑包休闲书包男多功能大旅游包
 11 	149.00	花花公子男士背包2020年新款商务电脑双肩包高中学生大容量书包
 12 	149.00	PUMA彪马背包2020新款女包双肩包拎包休闲小包PU小书包076960-02
 13 	598.00	Herschel Nova 时尚双肩包Gradient渐变系列休闲背包 书包10501
 14 	189.00	阿迪达斯双肩包男女2020新款初中生高中学生书包大容量背包DT8638
 15 	998.00	Herschel Little America经典色旅游双肩包男女士背包书包10020
 16 	409.00	初弎牛仔善恶 学生书包街头潮流男女时尚休闲双肩包男士背包41413
 17 	179.00	安踏双肩包2020潮牌大容量旅行背包男休闲简约学生书包运动背包男
 18 	479.00	Fjallraven/瑞典北极狐双肩包kanken书包女电脑旅行背包官方23510
 19 	145.00	不莱玫迪士尼合作款双肩包女韩版百搭可爱小书包ins潮酷旅行背包
 20 	288.00	【新品】JanSport杰斯伯双肩包女大学生书包男休闲背包4QUT04S
 21 	219.00	PUMA彪马双肩包男包女包2019新款运动包休闲背包学生书包074706
 22 	199.00	PUMA彪马官网正品双肩包男包女包2020春季新款运动包学生书包背包
 23 	199.00	瑞士军士刀双肩包男大容量休闲商务旅行电脑背包男士初中学生书包
 24 	289.00	Viney双肩包包2020新款潮真皮时尚背包女大容量书包韩版百搭女包
 25 	139.00	阿迪达斯双肩背包男包女包2020夏季新款运动电脑包学生书包FQ5261
 26 	218.00	【直营】Puma彪马女包双肩包运动包学生书包休闲包背包076944-02
 27 	298.00	【直营】Nike男女包BRSLA M BKPK-PRX GFX运动包双肩包书包CT6154
 28 	970.00	Gaston Luga瑞典潮牌背包男双肩包女大容量旅行包休闲书包电脑包
 29 	399.00	李宁双肩包男包女包2020新款乒乓球系列书包学生运动包ABJP182
 30 	199.00	Skechers斯凯奇青少年款男女童学生双肩背包大容量书包L419K019
 31 	698.00	kipling女大容量背包春夏新品时尚简约潮流休闲书包双肩包|MATTA
 32 	498.00	Tiger Family护脊减负书包 小学生3-5年级儿童女12周岁男童背包
 33 	889.00	kipling男女大容量电脑背包2020年新款时尚书包旅行双肩包|SEOUL
 34 	899.00	挪威官方正品Beckmann小学生书包女男儿童护脊减压背包1-3年级
 35 	129.00	uek小学生书包男孩女生一三五 六年级护脊双肩6-12岁轻便减压儿童
 36 	158.00	安踏花木兰联名双肩包男女官网2020新款学生书包大容量运动旅行包
 37 	178.00	迪士尼小学生书包女童1-3-4一三年级冰雪奇缘女孩减负儿童双肩包6
 38 	149.00	PUMA彪马双肩包2020夏季新款马卡龙初中高中学生书包运动包背包潮
 39 	199.00	Skechers斯凯奇新品青少年款男女童休闲大容量双肩包书包L120K001
 40 	189.00	阿迪达斯新款书包Adidas男包女包2020新款学生运动双肩包户外背包
 41 	139.00	探路者轻便双肩包户外防水旅行背包运动休闲小书包超轻印花皮肤包
 42 	438.00	tigerfamily小学生书包1-3年级男女孩儿童书包减负护脊背包6周岁
 43 	49.90 	ins书包女韩版高中原宿ulzzang初中生中学生百搭泫雅大容量双肩包
 44 	115.00	kk树书包小学生女孩6-12岁儿童一二三到六年级女童双肩包护脊减负
 45 	399.00	FILA斐乐童装旗舰店儿童双肩包小学生书包男童女童低年级背包新款
 46 	142.00	七匹狼双肩包男大容量背包书包新款超大商务休闲旅行笔记本电脑包
 47 	129.00	小米双肩包书包男女笔记本电脑包时尚潮流旅行背包
 48 	188.00	迪士尼拉杆书包小学生女童3-6年级公主3轮爬楼女孩两用儿童双肩包
 49 	419.00	Fjallraven/北极狐双肩包kanken mini 迷你情侣书包背包女23561
 50 	142.00	七匹狼双肩包男大容量背包书包新款超大商务休闲旅行笔记本电脑包
 51 	129.00	小米双肩包书包男女笔记本电脑包时尚潮流旅行背包
 52 	188.00	迪士尼拉杆书包小学生女童3-6年级公主3轮爬楼女孩两用儿童双肩包
 53 	399.00	FILA斐乐童装旗舰店儿童双肩包小学生书包男童女童低年级背包新款
 54 	189.00	阿迪达斯双肩包男女2020新款初中生高中学生书包大容量背包DT8638
 55 	288.00	真皮双肩包女2020年新款书包女百搭大容量头层牛皮女士软皮背包潮
 56 	268.00	BOPAI博牌电脑背包男户外旅行休闲双肩包商务书包出差多功能男包
 57 	229.00	迪士尼商店 冰雪奇缘艾莎公主小学生书包儿童书包双肩包女童书包
 58 	219.00	PUMA彪马双肩包男包女包2019新款运动包休闲背包学生书包074706
 59 	288.00	【新品】JanSport杰斯伯双肩包女学生书包男背包运动休闲背包4QUT
 60 	288.00	JanSport杰斯伯旗舰店双肩背包男高中背包书包休闲运动包4QUT77R
 61 	175.00	不莱玫2020新款迪士尼书包时尚复古ins风小背包女双肩包迷你小包
 62 	698.00	Herschel Retreat春夏新色旅游双肩包男女士书包背包百搭10066
 63 	498.00	Herschel City中号校园双肩包男书包背包潮牌女 ins 百搭10486
 64 	179.00	安踏双肩包2020男士旅行大容量时尚潮流高中初中学生书包运动背包
 65 	669.00	kipling女士帆布背包2020年新款时尚简约休闲潮流书包双肩包|ROSE
 66 	189.00	阿迪达斯新款书包Adidas男包女包2020新款学生运动双肩包户外背包
 67 	149.00	PUMA彪马官网旗舰双肩包男包女包2020新款初中高中学生书包电脑包
 68 	869.00	kipling男女大容量电脑包2020新款时尚书包旅行包双肩包|SO BABY
 69 	378.00	tigerfamily儿童书包小学生一年级1-3 女男6岁耐磨减负护脊双肩包
 70 	175.00	不莱玫迪士尼合作款书包女韩版高中百搭ins双肩包时尚可爱小背包
 71 	168.00	儿童书包可爱幼儿园2-6岁宝宝甜甜圈彩虹韩版女童女孩双肩小背包
 72 	98.00 	迪士尼小学生书包女童1-3-4三四年级冰雪奇缘女孩儿童减负双肩包6
 73 	899.00	[2020新款]挪威Beckmann小学生书包女男儿童护脊减压背包1-3年级
 74 	699.00	北极狐laptop笔记本电脑包13/15/17英寸男女手提双肩背包学生书包
 75 	149.00	花花公子男士背包2020年新款商务电脑双肩包高中学生大容量书包
 76 	299.00	CHARLES&KEITH女包CK2-80840173-1粗链条翻盖单肩情书包婚包
 77 	239.00	Skechers斯凯奇男女同款双肩背包书包LOGO刺绣运动休闲包L120U021
 78 	139.00	瑞士军士刀双肩包男大容量瑞士军刀旅行电脑背包男士初中学生书包
 79 	389.00	朱丹推荐诺狐书包小学生女孩一二三到六年级护脊减负儿童双肩背包
 80 	479.00	Fjallraven/北极狐书包kanken双肩包女户外包运动背包男23510
 81 	1588.00	【GPS定位】英国AnythingStudio小学生书包 儿童女进口英伦日本风
 82 	103.50	瑞士军刀双肩包男背包休闲商务旅行大容量瑞士书包高中生电脑男士
 83 	589.00	双肩包男士背包商务休闲旅行背包防盗旅游包女大中学生书包电脑包
 84 	209.00	EVB新款双肩包女韩版潮电脑背包旅行运动初高中小大学生书包男
 85 	398.00	安踏中国英雄双肩包潮牌街头嘻哈情侣双肩包男女时尚潮流书包背包
 86 	408.00	李宁CF溯系列双肩包敦煌拓男包女包2020新款学生书包运动包
 87 	2598.00	【亚洲限定款】天使之翼SEIBAN 日本保税护脊减负小学生粉色书包
 88 	195.02	国家地理背包女运动户外时尚双肩包男牛津布旅行防水学生情侣书包
 89 	2180.00	FREITAG F49 FRINGE 双肩包 旅行背包书包 瑞士环保潮流包
 90 	149.00	华为旗下荣耀亲选双肩包书包背包男女学生商务大学生大容量防水
 91 	218.00	【直营】Puma彪马女包双肩包运动包学生书包休闲包背包076944-02
 92 	178.00	书包ins韩版原宿ulzzang初中高中大学生百搭森系背包网红双肩包女
 93 	499.00	日本进口卡芙露书包小学生1-3年级6儿童轻便减负护脊男女双肩背包
 94 	499.00	Samsonite/新秀丽双肩包包2020新款 书包女ins风背包旅行包TQ4
 95 	119.00	Skechers斯凯奇2020春夏青少年男女童实用书包休闲双肩包L419K050
 96 	359.00	Sams nite新秀丽商务双肩包女 电脑背包大学生休闲书包男BU1
 97 	499.00	FION/菲安妮新款双肩包旅行包 女士印花背包青年防水名牌书包小包
 98 	149.00	爱果乐小学生书包女三四五六年级护脊减负儿童男双肩背包6-12岁
 99 	599.00	Fion/菲安妮时尚潮流双肩包女 小怪兽可爱学生书包简约女士小背包
100 	86.00 	迪士尼书包男小学生1-3-6三到六4年级儿童双肩护脊减负轻便背包女
101 	229.00	朱尔防盗双肩包女2020新款时尚牛津布女士背包百搭书包帆布女包包
102 	115.00	KK剑桥树书包小学生男孩一二三到六年级儿童6-12岁男童双肩包减负
103 	299.90	迪卡侬休闲旅行包出差大容量户外防雨罩男女书包登山包双肩包FOR3
104 	59.80 	儿童书包小学生男女一二三到六年级韩版减负护脊贵族书包轻便防水
105 	149.00	小米 米兔儿童书包 6-12岁男女小学生潮双肩背包幼儿园大容量背包
106 	498.00	ito双肩包男商务设计师电脑包14寸女潮流书包ins风小背包时尚百搭
107 	188.00	优仅ALLJOINT儿童书包可爱幼儿园双肩甜甜圈彩虹幼儿背包女童包包
108 	488.00	香港tigerfamily小学生护脊书包 男女5-9年级初中学生减负双肩包
109 	798.00	ito双肩包男商务设计师电脑包女皮质背包书包ins韩版原宿ulzzang
110 	153.00	七匹狼双肩包男大容量男士旅游背包休闲商务旅行包超大电脑包书包
111 	358.00	JanSport旗舰店官网双肩背包女电脑包男高中大学学生书包 3P6X47R
112 	288.00	【新品】JanSport杰斯伯双肩包女旗舰店电脑包男学生书包4QUT003
113 	698.00	Herschel Retreat经典色时尚潮流男女双肩包书包背包潮牌10066
114 	598.00	Herschel Dawson 双肩包男书包女ins风潮牌街头背包欧美10233
115 	319.00	NIKE耐克双肩包2020夏季新款男包女包学生书包运动包背包潮BA6097
116 	175.00	不莱玫迪士尼米奇双肩包新款韩版高中复古背包大容量学生帆布书包
117 	398.00	kipling男女大容量电脑背包2020年新款旅行包书包双肩包|BACKPACK
118 	168.00	迪士尼小学生书包男童女童1-3-4一三四年级蜘蛛侠儿童减负双肩包6
119 	78.00 	迪士尼书包小学生女童1-3-6一三年级冰雪公主女孩轻便儿童双肩包8
120 	698.00	kipling男女款大容量轻便帆布包简约复古休闲潮书包双肩包|MICAH
121 	129.00	Skechers斯凯奇2020春夏青少年男女童实用休闲双肩包书包L120K048
122 	179.00	安踏双肩包2020潮牌大容量旅行背包男休闲简约学生书包运动背包男
123 	378.00	tigerfamily书包小学生男孩1-3-6年级 初高中儿童护脊减负背包女
124 	249.00	Nike耐克2020年新款Tanjun儿童双肩背包男女休闲书包手提包拎包
125 	158.00	中国李宁双肩包男女2020新款时尚运动包书包背包学生电脑包户外包
126 	199.00	小米双肩包商务旅行背包大容量书包男士时尚多功能笔记本电脑包
127 	359.00	MYD双肩包女书包韩版大学生初中高中生中学生ins风肩包电脑背包男
128 	139.00	阿迪达斯学生书包男女包初中高中大学生电脑包运动双肩背包FI7968
129 	249.00	90分牛津帆布包休闲双肩包男时尚潮流背包书包男女韩版百搭电脑包
130 	1169.00	ergobag德国儿童减负护脊护肩书包中小学生书包男女1-5年级
131 	165.00	kk树小学生拉杆书包1-3-6年级女童6-12周岁儿童公主防水轻便背包
132 	299.00	BOPAI博牌双肩包男商务休闲简约大容量背包时尚书包15.6寸电脑包
133 	109.00	babycare宝宝入园书包婴 幼儿园小书包3岁男女儿童防走失背包可爱
134 	510.00	FILA斐乐童装儿童双肩包男女童3D护脊高年级中小学生书包2020新款
135 	76.00 	儿童书包小学生女一二三到六年级韩版减负护脊男孩轻便防水书包
136 	139.00	花花公子男士双肩包时尚潮流个性大学生书包休闲旅行电脑迷彩背包
# html

因为是动态的网页,所以要查看源码,之前那样就查找不到了

from lxml import etree
import requests
goods_name = "书包"  # 搜索商品类型
start_url = "https://s.taobao.com/search?q=" + goods_name
info_list = []
page = 3  # 爬取页面数量
count = 0
glist=[]
for i in range(page):
    count += 1
    
    try:
        url = start_url + "&s=" + str(44 * i)
        html = getHTMLText(url)  # 爬取url
        tree=etree.HTML(html)
        price_list = tree.xpath('//div[@class="row row-2 title"]/a@trace-price')
        name_list = tree.xpath('//div[@class="row row-2 title"]/a/text()')
        for i in range(len(price_list)):
            price = eval(price_list[i].split(":")[1])  #eval()在此可以去掉""
            name = eval(name_list[i].split(":")[1])
            glist.append([price, name])
#         parsePage(info_list, html) #解析HTML和爬取内容
        print("\r爬取页面当前进度: {:.2f}%".format(count * 100 / page), end="")  # 显示进度条
    except:
        continue
glist

[]

猜你喜欢

转载自blog.csdn.net/weixin_45569785/article/details/105743378