冲动小郭 发表于 2020-4-5 22:06:38

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

"""淘宝商品定向比价"""
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.split(':'))
            #对price类型进行提取,去掉前面得view_price字段,只保留价格部分,这里的eval函数可以将我们获得的字符串的最外面的”“去掉,用split来进行分割
            title=eval(tlt.split(':'))
            ilt.append()
    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,g)) #count商品序号,gg为名称和价格
   
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:08:23

请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢?

prophet-1 发表于 2020-4-5 22:41:32

冲动小郭 发表于 2020-4-5 22:08
请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢?

我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦,所以推荐先post登录信息,得到cookie,然后再进行爬取。

冲动小郭 发表于 2020-4-5 23:00:41

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

原来是这样,感谢您的提示。那看来我还需要再了解一下有关您提到的内容再进行完善代码了,我是最近才刚开始接触python爬虫,很多东西还了解的不多。您能写一下有关您提到部分的代码吗?方便我学习一下。万分感谢!

冲动小郭 发表于 2020-4-5 23:03:50

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

我查询到了相关的文章,感谢您的回复了!不需要您写代码提示了,嘿嘿。:D

prophet-1 发表于 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给你。

冲动小郭 发表于 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可还是运行不出来,请问是哪里的问题呢?(代码里的用户名和密码我在运行的时候都有填写,在这里删除了)

冲动小郭 发表于 2020-4-5 23:20:43

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

好的!谢谢你!:D

prophet-1 发表于 2020-4-5 23:36:59

冲动小郭 发表于 2020-4-5 23:20
好的!谢谢你!:D

我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能得到数据。:)
所以直接添加cookie就行。

冲动小郭 发表于 2020-4-6 16:37:56

prophet-1 发表于 2020-4-5 23:36
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能 ...

我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一部分的内容的含义以及这个是怎么得来的,想请教一下您{:10_266:}。
[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 = 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 ""

冲动小郭 发表于 2020-4-6 17:09:50

prophet-1 发表于 2020-4-5 23:36
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能 ...

我找不到我的cookie...我去浏览器里开发者工具里,network找不到对应的网页响应。
C:\Users\Guo\Desktop\1.png

prophet-1 发表于 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)

冲动小郭 发表于 2020-4-6 17:25:48

冲动小郭 发表于 2020-4-6 17:09
我找不到我的cookie...我去浏览器里开发者工具里,network找不到对应的网页响应。

我找到了!刷新了几下。。做这个例子没有运行成功反而让我学到了很多之前不知道的内容,很感激你的回复。
祝好!!!{:7_112:}

冲动小郭 发表于 2020-4-6 17:26:28

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

我成功找到我的cookie并且运行了。

prophet-1 发表于 2020-4-6 17:28:48

冲动小郭 发表于 2020-4-6 17:26
我成功找到我的cookie并且运行了。

:)加油!:)

冲动小郭 发表于 2020-4-6 17:28:58

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

嗯嗯,我百度了半天也是这样成功找到的。
最后也是修改代码简化按你的这个运行成功啦!!!
我继续探索更多未知的python世界了!感谢你哦!!{:7_112:}
页: [1]
查看完整版本: Python爬取淘宝商品信息进行比价,运行无错但只有表头没有商品信息怎么回事