鱼C论坛

 找回密码
 立即注册
查看: 2659|回复: 8

见鬼!!同样的一段爬虫代码,每次运行的结果不一样?!!

[复制链接]
发表于 2018-5-23 14:56:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 kerwin_lui 于 2018-5-23 14:58 编辑

项目背景:
跟着小甲鱼的视频进行操作,对小甲鱼的书——《零基础入门学习python》在淘宝上的销量进行统计!!

困惑:
虽然和小甲鱼的代码不完全一样,但我觉得代码实现的功能都是一样的!!
比如:
re.search(r" (love) ", "i love fishc").group(1)
re.findall() → 再用for循环出字符串

运行的结果硬是惊人的不一样,而且我同样的一段的代码,早上运行和下午运行的报错内容也是不一样?
wtf?想死的心都有~~

不知道各位鱼C的大牛,有没有遇到过这个心累的问题?????还是说是我代码或者软件的问题???


以下是我的代码:  (我是在Jupyter Notebook 和pycharm 上运行的)

版本一:(该版本是我自认为比较完善的代码,但就是运行不起来)
  1. # 用基础的爬虫代码,统计淘宝上《零基础入门学习python》这本小甲鱼的书的销量:

  2. import re
  3. import json
  4. import requests



  5. #得到网页HTML对象
  6. def Get_url_html(url, pages, keyword):
  7.     payload = {"q": str(keyword), "sort": "sale-desc", "s": str((pages - 1) * 44)}
  8.     headers = {}
  9.     headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
  10.     headers["Referer"] = "https://s.taobao.com/search?q=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E5%AD%A6%E4%B9%A0python&\
  11.     sort=sale-desc&s=0"
  12.     res = requests.get(url, params=payload, headers=headers)
  13.     return res


  14. #传入HTML文本,找到page_config对应的内容,转化成json格式
  15. def Get_page_config(url_html):
  16.     page_config = re.search(r"g_page_config =(.*?);\n ", url_html).group(1)
  17.     # print(page_config)  测试bug用
  18.     page_config_json = json.loads(page_config)
  19.     return page_config_json


  20. #传入json格式,进行数据整理,把自己需要的数据放入新的list中
  21. def Get_total_item_list(page_config_json):
  22.     auctions_list = page_config_json["mods"]["itemlist"]["data"]["auctions"]
  23.     total_item_list = []
  24.     for each_item in auctions_list:
  25.         each_item_target_dict = {}
  26.         each_item_target_dict.fromkeys(())
  27.         each_item_target_dict["raw_title"] = each_item["raw_title"]
  28.         each_item_target_dict["pic_url"] = each_item["pic_url"]
  29.         each_item_target_dict["view_price"] = each_item["view_price"]
  30.         each_item_target_dict["view_sales"] = each_item["view_sales"]
  31.         each_item_target_dict["comment_count"] = each_item["comment_count"]
  32.         total_item_list.append(each_item_target_dict)
  33.     # print(total_item_list)
  34.     return total_item_list


  35. #利用新构造的list ,进行数据统计,算出《入门学习python》的
  36. def Sum_sales_amounts(total_item_list):
  37.     cumulate_each_sales = 0
  38.     global cumulate_pages_sales_money
  39.     cumulate_pages_sales_money = 0
  40.     for each_list in total_item_list:
  41.         if "小甲鱼" in each_list["raw_title"]:
  42.             # if 1:
  43.             each_sales = int(re.search(r"\d+", each_list["view_sales"]).group())  ##每个商店的销量
  44.             print("每个商店的销量为 : ", each_sales)
  45.             each_price = float(re.search(r"\d+\.\d+", each_list["view_price"]).group())  # 每个商店的售价
  46.             cumulate_each_sales += each_sales  # 累加这一页所有商店的销量
  47.             each_sales_money = each_sales * each_price  # 计算这一页的每一个商店的销售额
  48.             cumulate_pages_sales_money += each_sales_money  # 累加这一页所有商店的销售额  (但是每个函数只能实现一个功能,return 1个变量,不考虑打包)
  49.         else:
  50.             continue
  51.     print(cumulate_each_sales)
  52.     print(cumulate_pages_sales_money)
  53.     return cumulate_each_sales


  54. def main():
  55.     pri_url = "https://s.taobao.com/search"
  56.     keyword = input("请输入关键词 :")
  57.     total_sales_amounts = 0
  58.     total_sales_money = 0
  59.     for i in range(10):
  60.         pages = i + 1
  61.         url_html = Get_url_html(pri_url, pages, keyword)    #得到网页HTML对象
  62.         page_config_json = Get_page_config(url_html.text)  #传入HTML文本,找到page_config对应的内容,转化成json格式
  63.         total_item_list = Get_total_item_list(page_config_json)   #传入json格式,进行数据整理,把自己需要的数据放入新的list中
  64.         pages_sales_amounts = Sum_sales_amounts(total_item_list)    #利用新构造的list ,进行数据统计,算出《入门学习python》的
  65.         
  66.         total_sales_amounts += pages_sales_amounts    #pages代表每个页面的销售总数   total代表所有页面的销售总数
  67.         print("第%d 页  目前总销量为 :%d" % (pages, total_sales_amounts))
  68.         pages_sales_money = cumulate_pages_sales_money
  69.         total_sales_money += pages_sales_money          #pages代表每个页面的销售金额   total代表所有页面的销售金额
  70.         print("第%d 页  目前总销售金额为 :%d" % (pages, total_sales_money))

  71. if __name__ == "__main__":
  72.     main()
复制代码


以下是报错的内容:
错误一:
AttributeError                            Traceback (most recent call last)
<ipython-input-12-8941ded1076f> in <module>()
     84
     85 if __name__ == "__main__":
---> 86     main()
     87
     88

<ipython-input-12-8941ded1076f> in main()
     71         pages = i + 1
     72         url_html = Get_url_html(pri_url, pages, keyword)    #得到网页HTML对象
---> 73         page_config_json = Get_page_config(url_html.text)  #传入HTML文本,找到page_config对应的内容,转化成json格式
     74         total_item_list = Get_total_item_list(page_config_json)   #传入json格式,进行数据整理,把自己需要的数据放入新的list中
     75         pages_sales_amounts = Sum_sales_amounts(total_item_list)    #利用新构造的list ,进行数据统计,算出《入门学习python》的

<ipython-input-12-8941ded1076f> in Get_page_config(url_html)
     19 #传入HTML文本,找到page_config对应的内容,转化成json格式
     20 def Get_page_config(url_html):
---> 21     page_config = re.search(r"g_page_config =(.*?);\n ", url_html).group(1)
     22     # print(page_config)  测试bug用
     23     page_config_json = json.loads(page_config)

AttributeError: 'NoneType' object has no attribute 'group'


错误二:
TypeError                                 Traceback (most recent call last)
<ipython-input-2-49aeccd1ba5b> in <module>()
     95
     96 if __name__ == "__main__":
---> 97     main()
     98

<ipython-input-2-49aeccd1ba5b> in main()
     85
     86         page_config_json = Get_page_config(url_html.text)
---> 87         total_item_list = Get_total_item_list(page_config_json)
     88         total_sales_amounts = Sum_sales_amounts(total_item_list)
     89         xxx += total_sales_amounts

<ipython-input-2-49aeccd1ba5b> in Get_total_item_list(page_config_json)
     40
     41 def Get_total_item_list(page_config_json):
---> 42     auctions_list = page_config_json["mods"]["itemlist"]["data"]["auctions"]
     43     total_item_list = []
     44     for each_item in auctions_list:

TypeError: 'int' object is not subscriptable



——————————————————丑陋的分割线————————————————

版本二:
(该版本实际就是把re.search 改成 re.findall 然后在遍历出字符串,就莫名其妙对了,想哭!!
  1. import re
  2. import json
  3. import requests

  4. def get_page_config(url_html):
  5.     listxxx = re.findall(r"g_page_config =(.*?);\n ", url_html)
  6.     yy = "0"
  7.     for xx in listxxx:
  8.         yy = xx
  9.     page_config = yy
  10.     # print(page_config)
  11.     page_config_json = json.loads(page_config)

  12.     return page_config_json



  13. def Get_url_html(url, pages, keyword):
  14.     payload = {"q": str(keyword), "sort": "sale-desc", "s": str((pages - 1) * 44)}
  15.     headers = {}
  16.     headers[
  17.         "User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
  18.     headers["Referer"] = "https://s.taobao.com/search?q=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E5%AD%A6%E4%B9%A0python&\
  19.     sort=sale-desc&s=0"
  20.     res = requests.get(url, params=payload, headers=headers)
  21.     return res


  22. def Get_total_item_list(page_config_json):
  23.     auctions_list = page_config_json["mods"]["itemlist"]["data"]["auctions"]
  24.     total_item_list = []
  25.     for each_item in auctions_list:
  26.         each_item_target_dict = {}
  27.         each_item_target_dict.fromkeys(())
  28.         each_item_target_dict["raw_title"] = each_item["raw_title"]
  29.         each_item_target_dict["pic_url"] = each_item["pic_url"]
  30.         each_item_target_dict["view_price"] = each_item["view_price"]
  31.         each_item_target_dict["view_sales"] = each_item["view_sales"]
  32.         each_item_target_dict["comment_count"] = each_item["comment_count"]
  33.         total_item_list.append(each_item_target_dict)
  34.     # print(total_item_list)
  35.     return total_item_list


  36. def Sum_sales_amounts(total_item_list):
  37.     cumulate_each_sales = 0
  38.     cumulate_each_sales_money = 0
  39.     for each_list in total_item_list:
  40.         if "小甲鱼" in each_list["raw_title"]:
  41.             # if 1:
  42.             each_sales = int(re.search(r"\d+", each_list["view_sales"]).group())  ##每个商店的销量
  43.             print("每个商店的销量为 : ", each_sales)
  44.             each_price = float(re.search(r"\d+\.\d+", each_list["view_price"]).group())  # 每个商店的售价
  45.             cumulate_each_sales += each_sales  # 累加所有商店的销量
  46.             each_sales_money = each_sales * each_price  # 计算每一个商店的销售额
  47.             cumulate_each_sales_money += each_sales_money  # 累加所有商店的销售额  (但是每个函数只能实现一个功能,return 1个变量,不考虑打包)
  48.         else:
  49.             continue
  50.     print(cumulate_each_sales)
  51.     return cumulate_each_sales


  52. def main():
  53.     pri_url = "https://s.taobao.com/search"
  54.     keyword = input("请输入关键词 :")
  55.     xxx = 0
  56.     for i in range(10):
  57.         pages = i + 1
  58.         url_html = Get_url_html(pri_url, pages, keyword)

  59.         page_config_json = get_page_config(url_html.text)
  60.         total_item_list = Get_total_item_list(page_config_json)
  61.         total_sales_amounts = Sum_sales_amounts(total_item_list)
  62.         xxx += total_sales_amounts
  63.         print("第%d 页  目前总销量为 :%d" % (pages, xxx))

  64. if __name__ == "__main__":
  65.     main()
复制代码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-23 17:30:40 | 显示全部楼层
Interesting boy......我们好像在哪见过
VP{YRI$}~V$YY%F[[YEP9]C.png
我试了下,代码没有问题,可以正常运行。。。
incapable of action?
个人猜测:
小伙子你爬的频繁IP被封了。。。你可以换个网络试试。。。。
没爬过淘宝,不过大家有个共识:
双11爬淘宝。。。
T_T
试试Selenium之类的吧。会好些。或者多加代理。数据还是有可能不全的。
Emmm,逃离无意义的斗智斗勇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2018-5-24 19:26:30 | 显示全部楼层
Charles未晞 发表于 2018-5-23 17:30
Interesting boy......我们好像在哪见过

我试了下,代码没有问题,可以正常运行。。。

哈哈,是的,你之前回答过我的问题,然后我还顺手关注了你的公众号,哈哈哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-24 19:32:02 | 显示全部楼层
Charles未晞 发表于 2018-5-23 17:30
Interesting boy......我们好像在哪见过

我试了下,代码没有问题,可以正常运行。。。

你用的是ide运行的代码吗??我觉得应该不是ip的问题吧,报错提示中也没说是IP~~你之前有没有遇到过这样相同代码运行结果不一样的情况呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-24 20:39:32 | 显示全部楼层
kerwin_lui 发表于 2018-5-24 19:32
你用的是ide运行的代码吗??我觉得应该不是ip的问题吧,报错提示中也没说是IP~~你之前有没有 ...

我都直接在cmd里运行的。。。
爬大网站都遇到过,数据抓不全什么的,原因很多的,大网站反爬虫措施也很完善。。。
你可以用浏览器进下淘宝,被封的话应该浏览器也进不去的。。。
一开始能抓到数据后面抓不到只能是被封了或者网页里的数据格式不统一。。。
你试试直接用selenium这些解析网页然后抓呗,没有特殊要求完全可以这样。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-24 20:40:02 | 显示全部楼层
kerwin_lui 发表于 2018-5-24 19:32
你用的是ide运行的代码吗??我觉得应该不是ip的问题吧,报错提示中也没说是IP~~你之前有没有 ...

如果你现在可以运行就是说明你之前被封了IP
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-25 01:34:01 | 显示全部楼层
Charles未晞 发表于 2018-5-24 20:39
我都直接在cmd里运行的。。。
爬大网站都遇到过,数据抓不全什么的,原因很多的,大网站反爬虫措施也很 ...

好的,感谢未晞大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-26 20:33:09 | 显示全部楼层
销量不一样不是很正常嘛 这个数据本来就是实时变动的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-27 01:31:02 | 显示全部楼层
清风揽月shine 发表于 2018-5-26 20:33
销量不一样不是很正常嘛 这个数据本来就是实时变动的

不是啦,我的意思是报错的提示不一样~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 15:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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