鱼C论坛

 找回密码
 立即注册
查看: 1269|回复: 15

[已解决]Python爬取淘宝商品信息进行比价,运行无错但只有表头没有商品信息怎么回事

[复制链接]
发表于 2020-4-5 22:06:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
"""淘宝商品定向比价"""
import requests
import re

def getHTMLText(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        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)#正则表达式将view_price和后面的价格\d.表示出来
        tlt=re.findall(r'"raw_title"\:".*?"',html)#*?表示最小匹配,匹配的是"raw_title"为键,""为值的键值对,最小匹配表明她只取得最后一个双引号为止得内容,进行约束
        for i in range(len(plt)):
            price=eval(plt[i].split(':')[1])
            #对price类型进行提取,去掉前面得view_price字段,只保留价格部分,这里的eval函数可以将我们获得的字符串的最外面的”“去掉,用split来进行分割
            title=eval(tlt[i].split(':')[1])
            ilt.append([price,title])
    except:
        print("")

def printGoodsList(ilt):
    #定义一个tplt模板,表示我们希望我们获取的信息以怎样的方式打印出来,用{}来指定第一个位置长度为4,第二个为8
    tplt="{:4}\t{:8}\t{:16}"
    print(tplt.format("序号","价格","商品名称"))
    count=0 #定义一个输出信息的计数器count
    for g in ilt:
        count=count+1
        print(tplt.format(count,g[0],g[1])) #count商品序号,g[0]g[1]为名称和价格
   
def main():
    goods='书包'
    depth=2  #设定爬取深度为2,就是爬取当前页面和第2页
    start_url='https://s.taobao.com/search?q=' + goods  #通过将url与goods结合实现对商品的检索
    infoList=[]
    for i in range(depth):
        try:
            url=start_url + '&s=' +str(44*i)
            #这里的44*i是指对每一个页面,地址后面的有一个变量s是44的倍数
            html=getHTMLText(url)
            parsePage(infoList,html)
        except:
            continue
        #这里用try-except来进行异常处理,如果访问第一个页面有问题,跳转到下一页
    printGoodsList(infoList)

main()

运行结果:
序号          价格              商品名称            

Process finished with exit code 0


我跟着北理工一个老师的教学视频写的此代码,但是我却爬取不到商品信息,是哪里出了问题呢?求助大神!
最佳答案
2020-4-5 22:41:32
冲动小郭 发表于 2020-4-5 22:08
请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢?

我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦,所以推荐先post登录信息,得到cookie,然后再进行爬取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-5 22:08:23 | 显示全部楼层
请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-5 22:41:32 | 显示全部楼层    本楼为最佳答案   
冲动小郭 发表于 2020-4-5 22:08
请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢?

我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦,所以推荐先post登录信息,得到cookie,然后再进行爬取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-5 23:00:41 | 显示全部楼层
prophet-1 发表于 2020-4-5 22:41
我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦, ...

原来是这样,感谢您的提示。那看来我还需要再了解一下有关您提到的内容再进行完善代码了,我是最近才刚开始接触python爬虫,很多东西还了解的不多。您能写一下有关您提到部分的代码吗?方便我学习一下。万分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-5 23:03:50 | 显示全部楼层
prophet-1 发表于 2020-4-5 22:41
我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦, ...

我查询到了相关的文章,感谢您的回复了!不需要您写代码提示了,嘿嘿。:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-5 23:06:16 | 显示全部楼层
冲动小郭 发表于 2020-4-5 23:00
原来是这样,感谢您的提示。那看来我还需要再了解一下有关您提到的内容再进行完善代码了,我是最近才刚开 ...
def getHTMLText(url):
    cookie = ''#你淘宝的cookie
    try:
        kv={'user-agent':'Mozilla/5.0','Cookie': cookie}
        r=requests.get(url,headers=kv,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
         return ""
这是手动添加cookie。因为当时临时使用的,所以没有写自动获取cookie的代码。
明天我写个demo给你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-5 23:19:31 | 显示全部楼层
def getHTMLText(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        post_url="https://login.taobao.com/member/login.jhtml?from=taobaoindex&f=top&style=&sub=true&redirect_url=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm%3Fspm%3Da230r.1.1997525045.1.16f52cd4t3S4VE"
        userdate={'username':'','password':''}
        post_res=requests.post(post_url,userdata)
        #cookie
        print(post_res.cookies)
        print(post_res.cookies.get_dict())
        r=requests.get(url,headers=kv,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
         return ""
我添加了post和cookies可还是运行不出来,请问是哪里的问题呢?(代码里的用户名和密码我在运行的时候都有填写,在这里删除了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-5 23:20:43 | 显示全部楼层
prophet-1 发表于 2020-4-5 23:06
这是手动添加cookie。因为当时临时使用的,所以没有写自动获取cookie的代码。
明天我写个demo给你。

好的!谢谢你!:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-5 23:36:59 | 显示全部楼层

我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能得到数据。:)
所以直接添加cookie就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 16:37:56 | 显示全部楼层
prophet-1 发表于 2020-4-5 23:36
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能 ...

我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一部分的内容的含义以及这个是怎么得来的,想请教一下您
[code
]def getHTMLText(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        #cookie
        coo = 't=85db5e7cb0133f23f29f98c7d6955615; cna=3uklFEhvXUoCAd9H6ovaVLTG; isg=BM3NGT0Oqmp6Mg4qfcGPnvDY3-pNqzF2joji8w9SGWTYBu241_taTS6UdFrF3Rk0; miid=983575671563913813; thw=cn; um=535523100CBE37C36EEFF761CFAC96BC4CD04CD48E6631C3112393F438E181DF6B34171FDA66B2C2CD43AD3E795C914C34A100CE538767508DAD6914FD9E61CE; _cc_=W5iHLLyFfA%3D%3D; tg=0; enc=oRI1V9aX5p%2BnPbULesXvnR%2BUwIh9CHIuErw0qljnmbKe0Ecu1Gxwa4C4%2FzONeGVH9StU4Isw64KTx9EHQEhI2g%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=0_0; hibext_instdsigdipv2=1; JSESSIONID=EC33B48CDDBA7F11577AA9FEB44F0DF3'
        cookies = {}
        for line in coo.split(';'):  # 浏览器伪装
            name, value = line.strip().split('=', 1)
            #split('.',1)代表按某一个字符分割,且分割n次
            #s.strip(rm)删除s字符串中开头结尾处位于rm删除序列的字符,当rm为空时,默认删除空白符(包括\n,\r,\t)
            cookies[name] = value
        r=requests.get(url,headers=kv,cookies=cookies,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
         return ""
[/code]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 17:09:50 | 显示全部楼层
prophet-1 发表于 2020-4-5 23:36
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能 ...

我找不到我的cookie...我去浏览器里开发者工具里,network找不到对应的网页响应。
C:\Users\Guo\Desktop\1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 17:13:45 | 显示全部楼层
冲动小郭 发表于 2020-4-6 16:37
我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一 ...

coo就是cookie。这个是,你登录淘宝后,给你的一个凭证,之后就不用再进行登录了(有的cookie具有时效)。
获得的方法:
登录你的淘宝,然后F12,点击控制台。
输入:document.cookie
输出的就是cookie。

其实不需要他这么麻烦,直接在kv中添加Cookie就行。
kv={'user-agent':'Mozilla/5.0','Cookie': coo}
r = requests.get(url,headers=kv)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 17:25:48 | 显示全部楼层
冲动小郭 发表于 2020-4-6 17:09
我找不到我的cookie...我去浏览器里开发者工具里,network找不到对应的网页响应。

我找到了!刷新了几下。。做这个例子没有运行成功反而让我学到了很多之前不知道的内容,很感激你的回复。
祝好!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 17:26:28 | 显示全部楼层
冲动小郭 发表于 2020-4-6 16:37
我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一 ...

我成功找到我的cookie并且运行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 17:28:48 | 显示全部楼层
冲动小郭 发表于 2020-4-6 17:26
我成功找到我的cookie并且运行了。

:)  加油!:)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 17:28:58 | 显示全部楼层
prophet-1 发表于 2020-4-6 17:13
coo就是cookie。这个是,你登录淘宝后,给你的一个凭证,之后就不用再进行登录了(有的cookie具有时效) ...

嗯嗯,我百度了半天也是这样成功找到的。
最后也是修改代码简化按你的这个运行成功啦!!!
我继续探索更多未知的python世界了!感谢你哦!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表