鱼C论坛

 找回密码
 立即注册
查看: 759|回复: 19

[已解决]有关蚂蜂窝网站爬虫的问题

[复制链接]
发表于 2018-9-27 16:17:17 | 显示全部楼层 |阅读模式

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

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

x
各位前辈,在下爬虫新手
最近在做蚂蜂窝网站的游记文本爬取工作,发现一个问题,在爬取游记文本的过程中,只能获得网页上一部分的文本,并不能将游记全文全部获取,想请教各位前辈,这是我代码编写的问题,还是网站对爬虫有所限制?
还请各位指教
代码如下:

  1. from bs4 import BeautifulSoup
  2. import urllib
  3. import time

  4. html = urllib.request.urlopen("http://www.mafengwo.cn/i/9444273.html")
  5. bsObj = BeautifulSoup(html, 'html.parser')

  6. t1 = bsObj.find('div',class_="main")
  7. t2 = t1.find('div',class_="view clearfix")
  8. t3 = t1.find('div',class_="view_con")
  9. t4 = t3.find('div',class_="vc_article")
  10. t5 = t4.find('div', class_='va_con _j_master_content')
  11. t6 = t5.find('div', class_='_j_content_box')
  12. t7 = t6.find_all('p',class_='_j_note_content _j_seqitem')

  13. for t in t7:
  14.     h2 = t.get_text()
  15.     print(h2)
  16.     time.sleep(2)
复制代码
最佳答案
2018-9-27 17:04:47
本帖最后由 wongyusing 于 2018-9-27 17:13 编辑

这是因为网页加载问题吧,你一开始获取的页面是未全部加载完成的页面。  

我们人类浏览的时候,是通过把页面往下拉,才能获取到所有内容。   

你用开发者工具浏览一下,当拖动页面时,请求了什么内容。

因为js会请求后端获取内容的。   
  1. <script>
  2.     //判断是否显示 下拉bar
  3. ;(function () {
  4.     window.showBarFlag = true;
  5.     var realPathName = location.pathname,$nav = $('#Js_middleNav');
  6.     var regExp = /localdeals|sales|flight|insurance|activity/gi;
  7.     var pathArr = realPathName.match(regExp);
  8.         if(window.Env.middleNavHide) { $('.dropdown-bar').hide();return;}
  9.         if(realPathName == '/sales/0-0-0-5-0-0-0-0.html' || window.Env.salesType ==5){
  10.             $nav.children('[data-type="cruise"]').addClass('on');
  11.             window.showBarFlag = false;
  12.             $('.dropdown-bar').show();
  13.         }else if(realPathName == '/localdeals/0-0-0-21-0-0-0-0.html' || window.Env.salesType ==21){
  14.             $nav.children('[data-type="wifi"]').addClass('on');
  15.             window.showBarFlag = false;
  16.             $('.dropdown-bar').show();
  17.         }else if(window.Env.sales_title_tag == 'visa' || window.Env.salesType == 4){
  18.             $nav.children('[data-type="visa"]').addClass('on');
  19.             window.showBarFlag = false;
  20.             $('.dropdown-bar').show();
  21.         }else if(window.Env.sales_title_tag == 'semi_self_service' || realPathName == '/sales/0-0-0-6-0-0-0-0.html?group=4' || window.Env.salesType == 30 || window.Env.salesType == 6){
  22.             $nav.children('[data-type="freewalker"]').addClass('on');
  23.             window.showBarFlag = false;
  24.             $('.dropdown-bar').show();
  25.         }
  26.         else if(window.Env.salesType) {
  27.             switch(window.Env.salesType|0) {
  28.                 case 1:
  29.                 case 3:
  30.                     $nav.children('[data-type="sales"]').addClass('on');
  31.                     break;
  32.                 case 2:
  33.                     $nav.children('[data-type="localdeals"]').addClass('on');
  34.                     break;
  35.                 case 30:
  36.                 case 6:
  37.                     $nav.children('[data-type="freewalker"]').addClass('on');
  38.                     break;
  39.                 default:
  40.                     $nav.children('[data-type="localdeals"]').addClass('on');
  41.                     break;
  42.             }
  43.             window.showBarFlag = false;
  44.             $('.dropdown-bar').show();
  45.         }
  46.         else {
  47.             if( pathArr){
  48.                 if(pathArr.length == 1 && pathArr[0] != 'activity'){
  49.                     switch(pathArr[0]){
  50.                         case 'localdeals':
  51.                             $nav.children('[data-type="localdeals"]').addClass('on');
  52.                             break;
  53.                         case 'insurance':
  54.                             $nav.children('[data-type="insurance"]').addClass('on');
  55.                             break;
  56.                         case 'sales':
  57.                             $nav.children('[data-type="sales"]').addClass('on');
  58.                             break;
  59.                         case 'flight':
  60.                             $nav.children('[data-type="flight"]').addClass('on');
  61.                             break;
  62.                         default:
  63.                             break;
  64.                     }
  65.                     window.showBarFlag = false;
  66.                     $('.dropdown-bar').show();
  67.                 }else {
  68.                     if('activity'.indexOf(pathArr) != -1){
  69.                         window.showBarFlag  = true;
  70.                         $('.dropdown-bar').hide();
  71.                     }
  72.                 }
  73.         }
  74.     }
  75.         // 点击时触发
  76.         $('.ul-dropdown-bar > li').on('click',function () {
  77.             $(this).addClass('on').siblings().removeClass('on');
  78.         });
  79. })();

  80. </script>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-27 16:26:42 | 显示全部楼层
好歹也加个headers
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-27 16:28:15 | 显示全部楼层

谢谢您的回复,我之前有加header,得到的结果是一样的呀~
很蛋疼啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 16:37:46 | 显示全部楼层
加了可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-27 16:48:41 | 显示全部楼层

我刚刚修改了一下,结果依然不对,可能是我写错了,
  1. import requests
  2. from bs4 import BeautifulSoup#用于解析网页
  3. import urllib
  4. import time


  5. url = "http://www.mafengwo.cn/i/9444273.html"
  6. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
  7. req = requests.get(url,headers = headers)
  8. html = urllib.request.urlopen(url)
  9. bsObj = BeautifulSoup(html, 'html.parser')
  10. t1 = bsObj.find('div',class_="main")
  11. t2 = t1.find('div',class_="view clearfix")
  12. t3 = t1.find('div',class_="view_con")
  13. t4 = t3.find('div',class_="vc_article")
  14. t5 = t4.find('div', class_='va_con _j_master_content')
  15. t6 = t5.find('div', class_='_j_content_box')
  16. t7 = t6.find_all('p',class_='_j_note_content _j_seqitem')   
  17.    
  18. for t in t7:
  19.     h2 = t.get_text()
  20.     print(h2)
  21.     time.sleep(3)
复制代码

输出的结果,依旧是只到 “6月23日,拖延症患者终于手账补完了。”这句话。
还请您给指点一下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 16:58:58 | 显示全部楼层
zzx1994zzx 发表于 2018-9-27 16:48
我刚刚修改了一下,结果依然不对,可能是我写错了,

输出的结果,依旧是只到 “6月23日,拖延症患者终 ...

好像也是到6.23
好吧,等大神来指导下,不知道跟cookie关系大不大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-27 17:00:14 | 显示全部楼层
塔利班 发表于 2018-9-27 16:58
好像也是到6.23
好吧,等大神来指导下,不知道跟cookie关系大不大

嗯嗯,无论如何,谢谢您!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:02:06 | 显示全部楼层
zzx1994zzx 发表于 2018-9-27 17:00
嗯嗯,无论如何,谢谢您!

没事,我只是试了试,爬虫跟没学一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:04:05 | 显示全部楼层
好像跟JS动态加载有关系,里面好像有判断的语句,但是还是等大神来解释吧,一同学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:04:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wongyusing 于 2018-9-27 17:13 编辑

这是因为网页加载问题吧,你一开始获取的页面是未全部加载完成的页面。  

我们人类浏览的时候,是通过把页面往下拉,才能获取到所有内容。   

你用开发者工具浏览一下,当拖动页面时,请求了什么内容。

因为js会请求后端获取内容的。   
  1. <script>
  2.     //判断是否显示 下拉bar
  3. ;(function () {
  4.     window.showBarFlag = true;
  5.     var realPathName = location.pathname,$nav = $('#Js_middleNav');
  6.     var regExp = /localdeals|sales|flight|insurance|activity/gi;
  7.     var pathArr = realPathName.match(regExp);
  8.         if(window.Env.middleNavHide) { $('.dropdown-bar').hide();return;}
  9.         if(realPathName == '/sales/0-0-0-5-0-0-0-0.html' || window.Env.salesType ==5){
  10.             $nav.children('[data-type="cruise"]').addClass('on');
  11.             window.showBarFlag = false;
  12.             $('.dropdown-bar').show();
  13.         }else if(realPathName == '/localdeals/0-0-0-21-0-0-0-0.html' || window.Env.salesType ==21){
  14.             $nav.children('[data-type="wifi"]').addClass('on');
  15.             window.showBarFlag = false;
  16.             $('.dropdown-bar').show();
  17.         }else if(window.Env.sales_title_tag == 'visa' || window.Env.salesType == 4){
  18.             $nav.children('[data-type="visa"]').addClass('on');
  19.             window.showBarFlag = false;
  20.             $('.dropdown-bar').show();
  21.         }else if(window.Env.sales_title_tag == 'semi_self_service' || realPathName == '/sales/0-0-0-6-0-0-0-0.html?group=4' || window.Env.salesType == 30 || window.Env.salesType == 6){
  22.             $nav.children('[data-type="freewalker"]').addClass('on');
  23.             window.showBarFlag = false;
  24.             $('.dropdown-bar').show();
  25.         }
  26.         else if(window.Env.salesType) {
  27.             switch(window.Env.salesType|0) {
  28.                 case 1:
  29.                 case 3:
  30.                     $nav.children('[data-type="sales"]').addClass('on');
  31.                     break;
  32.                 case 2:
  33.                     $nav.children('[data-type="localdeals"]').addClass('on');
  34.                     break;
  35.                 case 30:
  36.                 case 6:
  37.                     $nav.children('[data-type="freewalker"]').addClass('on');
  38.                     break;
  39.                 default:
  40.                     $nav.children('[data-type="localdeals"]').addClass('on');
  41.                     break;
  42.             }
  43.             window.showBarFlag = false;
  44.             $('.dropdown-bar').show();
  45.         }
  46.         else {
  47.             if( pathArr){
  48.                 if(pathArr.length == 1 && pathArr[0] != 'activity'){
  49.                     switch(pathArr[0]){
  50.                         case 'localdeals':
  51.                             $nav.children('[data-type="localdeals"]').addClass('on');
  52.                             break;
  53.                         case 'insurance':
  54.                             $nav.children('[data-type="insurance"]').addClass('on');
  55.                             break;
  56.                         case 'sales':
  57.                             $nav.children('[data-type="sales"]').addClass('on');
  58.                             break;
  59.                         case 'flight':
  60.                             $nav.children('[data-type="flight"]').addClass('on');
  61.                             break;
  62.                         default:
  63.                             break;
  64.                     }
  65.                     window.showBarFlag = false;
  66.                     $('.dropdown-bar').show();
  67.                 }else {
  68.                     if('activity'.indexOf(pathArr) != -1){
  69.                         window.showBarFlag  = true;
  70.                         $('.dropdown-bar').hide();
  71.                     }
  72.                 }
  73.         }
  74.     }
  75.         // 点击时触发
  76.         $('.ul-dropdown-bar > li').on('click',function () {
  77.             $(this).addClass('on').siblings().removeClass('on');
  78.         });
  79. })();

  80. </script>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:19:42 | 显示全部楼层
wongyusing 发表于 2018-9-27 17:04
这是因为网页加载问题吧,你一开始获取的页面是未全部加载完成的页面。  

我们人类浏览的时候,是通过把 ...

这部分是开发工具哪里看到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-27 17:19:46 | 显示全部楼层
wongyusing 发表于 2018-9-27 17:04
这是因为网页加载问题吧,你一开始获取的页面是未全部加载完成的页面。  

我们人类浏览的时候,是通过把 ...

谢谢您,我刚看了一下,这个页面的确是JS动态加载的,我要换个思路来做这个事情了
emmm……还有就是,您这个代码,我着实看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:21:50 | 显示全部楼层
看了一下,是通过ajax请求这个网址http://www.mafengwo.cn/note/ajax ... 36868057&back=0

参数很多,有点难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-27 17:24:40 | 显示全部楼层
wongyusing 发表于 2018-9-27 17:21
看了一下,是通过ajax请求这个网址http://www.mafengwo.cn/note/ajax.php?act=getNoteDetailContentChunk&i ...

谢谢您了,参数多也木有办法了,我慢慢调试吧
这把可被导师坑惨了……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:29:38 | 显示全部楼层
你要加上很多header参数来请求
  1. http://www.mafengwo.cn/note/ajax.php?act=getNoteDetailContentChunk&id=9444273&iid=305309566&seq=336868057&back=0
复制代码
。  
id的是文章的id
iid是内容的id,变化的规律还是看不太懂,获取到的是json数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:31:53 | 显示全部楼层
塔利班 发表于 2018-9-27 17:19
这部分是开发工具哪里看到的

network啊, 我先去吃饭,回来再告诉你吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 17:33:55 | 显示全部楼层
zzx1994zzx 发表于 2018-9-27 17:19
谢谢您,我刚看了一下,这个页面的确是JS动态加载的,我要换个思路来做这个事情了
emmm……还有就是,您 ...


这是页面的js触发开关的部分代码。难的是找出,传入的参数规律
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 18:04:05 | 显示全部楼层
zzx1994zzx 发表于 2018-9-27 17:24
谢谢您了,参数多也木有办法了,我慢慢调试吧
这把可被导师坑惨了……

说错了,是ajax的url中的seq参数。  
讲真找不出规律。  
感觉好像是从最后一张图片中获取这个seq参数的。应该是上面我给你的这段js中判断的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 18:06:05 | 显示全部楼层
塔利班 发表于 2018-9-27 17:19
这部分是开发工具哪里看到的

刚才说错了,这段代码是从网页源代码中获取的,  

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

使用道具 举报

 楼主| 发表于 2018-9-27 19:01:28 | 显示全部楼层
wongyusing 发表于 2018-9-27 18:06
刚才说错了,这段代码是从网页源代码中获取的,

好的,谢谢您,真的麻烦您了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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