鱼C论坛

 找回密码
 立即注册
查看: 1642|回复: 12

[已解决]做练习爬虫 源码不显示网页里面的内容

[复制链接]
发表于 2018-10-8 14:20:50 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 暗夜之隐 于 2018-10-8 14:33 编辑

问题一:本想做一个淘宝商品信息抓取的爬虫,发现每次抓取的都并非这一页的所有内容。最后2排的商品在源码里面都找不到  那它是如何显示或是用了什么方法隐藏吗

问题二:有时会出现错误,但不是每次 关了重开又可以了

注意没有登录账号 所有有时会返回0 是跳转到登录页面了并且登录页面还是一个gbk的

代码如下

  1. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 99: invalid continuation byte
复制代码


  1. import urllib.request

  2. from urllib.request import quote

  3. import re



  4. def urlopen(url):

  5.    
  6.     req = urllib.request.Request(url)

  7.     req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")

  8.     html = urllib.request.urlopen(req)

  9.     html = html.read()

  10.     return html


  11. def content():
  12.    
  13.     word = '摄像头'

  14.     word = quote(word)

  15.     url = 'https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q={}&suggest=history_5&_input_charset=utf-8&wq=&suggest_query=&source=suggest'.format(word)

  16.     print(url)

  17.     cc = urlopen(url)

  18.     con = cc.decode("utf-8")

  19.     bian = re.compile(r'\xa9|\u2b50')

  20.     con = re.sub(bian,'',con)

  21.     with open("taobao.txt",'w',)as f:
  22.         
  23.         f.write(con)

  24.     return con


  25. con = content()
  26.    
  27. aa = re.findall(r'"nick":".+?","shopcard"',con)

  28. print(len(aa))

  29. #这里输放的是店铺名字的数量 只有36个 但应该是有48个才对  一共12排 一排4个
  30. # 另外边上的一排也没有广告位置的信息也没有呢




复制代码

最佳答案
2018-10-9 11:00:08
本帖最后由 wongyusing 于 2018-10-9 11:05 编辑

看代码,注意,填写饼干的信息
  1. import requests
  2. import re
  3. import json
  4. import pandas
  5. # 打开网页函数
  6. def get_response(url,commodity):
  7.     headers = {
  8.         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  9.         'Accept-Encoding': 'gzip, deflate, br',
  10.         'Accept-Language': 'zh-CN,zh;q=0.9',
  11.         'Cache-Control': 'no-cache',
  12.         'Connection': 'keep-alive',
  13.         'Pragma': 'no-cache',
  14.         'Upgrade-Insecure-Requests': '1',
  15.         'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
  16.         'cookie': 'xxxx',# cookie就不提供了,注意里面的 isg 参数  (需要你点击搜索栏后才会显示真正的参数)
  17.         }
  18.     params = {
  19.         'q': commodity,
  20.         'imgfile': {
  21.                     'js': '1',
  22.                     },
  23.         'stats_click': {
  24.             'search_radio_all':'1',
  25.             'initiative_id': 'staobaoz_20181009',
  26.             'ie': 'utf8',
  27.                 }
  28.             }
  29.     response = requests.get(url, headers=headers,params=params) # 加上浏览器头,以防被禁
  30.     response.encoding = 'utf-8'      # 指定编码格式
  31.     #response.encoding = 'gbk'      # 指定编码格式
  32.     return response
  33.     #OPlCFG6GXQsCAdoP6nmnEljY
  34. def main():
  35.     # 搜索的商品名
  36.     commodity = 'python书籍'

  37.     base_url = f'https://s.taobao.com/search?q={{ commodity }}&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20181009&ie=utf8'
  38.     response = get_response(base_url,commodity)
  39.    
  40.     req = 'g_page_config = (.*?)g_srp_loadCss'

  41.     items_list = re.findall(req,response.text,re.S)[0].strip()

  42.     js = json.loads(items_list[:-1])
  43.     jd = js['mods']['itemlist']['data']['auctions'] #.keys())
  44.     #
  45.     df = pandas.DataFrame(jd)
  46.     #
  47.     df[['category','raw_title','view_price','item_loc','view_sales']].to_html(f'{commodity}.html')



  48. if __name__ == "__main__":
  49.     main()
复制代码

这份代码和之前我写的不同点在于,饼干的参数(发英语会被审核)   
通过开发者工具可以发现,饼干的isg参数是淘宝的反爬的主要手段。  
当isg参数不被改变,我们就获取不到真正的数据。  
触发isg参数改变的开关在于我们是否点击了搜索栏  

我的这份代码中commodity好像是要中英结合,直接搜中文的内容,例如:火鸡面。好像是不行的。  
找不到原因。  

爬取下来的数据在当前的目录下的html文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-8 14:37:26 From FishC Mobile | 显示全部楼层
淘宝不知道有的用的什么加密,拿到的商品都掺杂了很多没用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-8 14:47:37 | 显示全部楼层
幽梦三影 发表于 2018-10-8 14:37
淘宝不知道有的用的什么加密,拿到的商品都掺杂了很多没用的

恩 是的呢  我觉得这好像是有点超过我现在的水平了  打算放弃 写更简单的 没加密的 先爬爬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-8 20:42:34 | 显示全部楼层
有下拉的Ajax请求时刷出来的后两行信息,
用selenium试试模拟下拉,能出现信息不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-8 21:12:53 | 显示全部楼层
塔利班 发表于 2018-10-8 20:42
有下拉的Ajax请求时刷出来的后两行信息,
用selenium试试模拟下拉,能出现信息不

我手动下拉 停留好一会儿  再看源码都没有这后面2行信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-8 21:52:37 From FishC Mobile | 显示全部楼层
淘宝的商品数据在网页源代码中的第4还是第5个js代码里面,是json格式的。
由于你的代码请求头参数不够,会导致淘宝给你返回很多不相关的信息。
淘宝的反爬策略是让你爬,但获取不到正确的信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-8 22:46:42 From FishC Mobile | 显示全部楼层
wongyusing 发表于 2018-10-8 21:52
淘宝的商品数据在网页源代码中的第4还是第5个js代码里面,是json格式的。
由于你的代码请求头参数不够,会 ...

就算手动去找json文件,发现里面的内容也是掺杂了别的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-8 23:14:54 | 显示全部楼层
幽梦三影 发表于 2018-10-8 22:46
就算手动去找json文件,发现里面的内容也是掺杂了别的东西

掺杂其它东西的话,整个页面上也就三四个吧,在右边的推荐广告那里。  
  
你可以一个一个的检查,页面上的json是没有错的。  
只是我们使用了爬虫,请求参数过少或不对,导致服务器响应一些错误的信息给我们。  
我测试过,用查看网页源代码的方式,网页源代码上的json数据是对的。  
我们的请求是错的。  

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

使用道具 举报

发表于 2018-10-9 11:00:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wongyusing 于 2018-10-9 11:05 编辑

看代码,注意,填写饼干的信息
  1. import requests
  2. import re
  3. import json
  4. import pandas
  5. # 打开网页函数
  6. def get_response(url,commodity):
  7.     headers = {
  8.         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  9.         'Accept-Encoding': 'gzip, deflate, br',
  10.         'Accept-Language': 'zh-CN,zh;q=0.9',
  11.         'Cache-Control': 'no-cache',
  12.         'Connection': 'keep-alive',
  13.         'Pragma': 'no-cache',
  14.         'Upgrade-Insecure-Requests': '1',
  15.         'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
  16.         'cookie': 'xxxx',# cookie就不提供了,注意里面的 isg 参数  (需要你点击搜索栏后才会显示真正的参数)
  17.         }
  18.     params = {
  19.         'q': commodity,
  20.         'imgfile': {
  21.                     'js': '1',
  22.                     },
  23.         'stats_click': {
  24.             'search_radio_all':'1',
  25.             'initiative_id': 'staobaoz_20181009',
  26.             'ie': 'utf8',
  27.                 }
  28.             }
  29.     response = requests.get(url, headers=headers,params=params) # 加上浏览器头,以防被禁
  30.     response.encoding = 'utf-8'      # 指定编码格式
  31.     #response.encoding = 'gbk'      # 指定编码格式
  32.     return response
  33.     #OPlCFG6GXQsCAdoP6nmnEljY
  34. def main():
  35.     # 搜索的商品名
  36.     commodity = 'python书籍'

  37.     base_url = f'https://s.taobao.com/search?q={{ commodity }}&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20181009&ie=utf8'
  38.     response = get_response(base_url,commodity)
  39.    
  40.     req = 'g_page_config = (.*?)g_srp_loadCss'

  41.     items_list = re.findall(req,response.text,re.S)[0].strip()

  42.     js = json.loads(items_list[:-1])
  43.     jd = js['mods']['itemlist']['data']['auctions'] #.keys())
  44.     #
  45.     df = pandas.DataFrame(jd)
  46.     #
  47.     df[['category','raw_title','view_price','item_loc','view_sales']].to_html(f'{commodity}.html')



  48. if __name__ == "__main__":
  49.     main()
复制代码

这份代码和之前我写的不同点在于,饼干的参数(发英语会被审核)   
通过开发者工具可以发现,饼干的isg参数是淘宝的反爬的主要手段。  
当isg参数不被改变,我们就获取不到真正的数据。  
触发isg参数改变的开关在于我们是否点击了搜索栏  

我的这份代码中commodity好像是要中英结合,直接搜中文的内容,例如:火鸡面。好像是不行的。  
找不到原因。  

爬取下来的数据在当前的目录下的html文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-10-9 11:02:03 | 显示全部楼层
幽梦三影 发表于 2018-10-8 22:46
就算手动去找json文件,发现里面的内容也是掺杂了别的东西

这次就不掺杂别的东西了,原来是饼干的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-9 11:09:55 | 显示全部楼层
wongyusing 发表于 2018-10-9 11:00
看代码,注意,填写饼干的信息

这份代码和之前我写的不同点在于,饼干的参数(发英语会被审核)   

谢谢 我试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-9 11:14:09 | 显示全部楼层
饼干的获取方式  
打开一个隐身窗口,
按下F12
点击NETWORK
然后在搜索栏输入
  1. https://s.taobao.com/search?q=python书籍&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20181009&ie=utf8
复制代码

点击分类中的DOC
查看search的requests的header
点击一下淘宝的搜索栏,饼干的isg参数改变
复制饼干内容到代码的饼干中
运行代码。  
搞定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-9 12:40:49 | 显示全部楼层
还有一点,注意了在params中的initiative_id和url中的值initiative_id是今天的日期。  
注意要修改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 17:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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