python抓取动态网页(爬取js动态生成的页面是获取不到内容的源代码 )

优采云 发布时间: 2021-12-05 06:17

  python抓取动态网页(爬取js动态生成的页面是获取不到内容的源代码

)

  抓取js动态生成的页面时,直接打开页面无法获取内容。比如我在抓取百度手机助手应用的时候就遇到了这样的问题。搜索旅游应用的时候,返回的数据有好几页内容,但是无论翻到哪一页,查看源码都可以找到,也就是第一页的源码。分析原因,我认为可能是这样的:假设百度应用的一个页面上有八个应用。你提交查询之后,他从内容的前八页生成一个html,然后你翻页的时候,替换成js,ajax等,原来的8个应用,比如你选择第五页的时候,用返回到应用程序列表的 33-40 个应用程序替换原来的 1-8 个应用程序。(应该是ajax或者其他更可能的表单提交方式,因为纯js不涉及表单提交等后端交互,第一次查询时所有结果都需要返回并存储在前端)【个人分析,请指正】

  文章 想法参考来自:感谢原作者

  好了,既然我们的目标已经明确了,那就找到对应的表达式提交(或js)动作。这里我们使用谷歌的开发者工具。我们接下来的操作是在谷歌浏览器中进行的。

  让我们从头开始:

  1、打开手机助手搜索“旅行”,网址:travel

  我们得到了一个搜索结果:搜索到你:461旅游申请结果

  

  这时候就可以查看源文件了。

  2、 翻页url:旅游#page2发现源文件还是一样,这是动态加载造成的,那后面的界面怎么把握呢?

  3、打开谷歌开发者工具:

  

  此时没有内容,需要加载一次页面:url:%E6%97%85%E6%B8%B8#page2

  在保留开发者工具如上图的前提下,在地址栏中输入你要解析的页面的URL(如上面的URL),然后就可以看到内容了:

  

  里面的东西很多,我们需要一一看,但是你会发现,真正有价值的东西并不多。我们终于找到了这个:

  

  这里的app名称就是我们想要爬取到第二页的app名称,这也是我们最终想要的。

  4、 右击左边红框,可以复制链接:%E6%97%85%E6%B8%B8&page=1&_=09

  打开这个链接后,我们发现这个网页的源码就是我们想要的(其实就是表单提交)。不是很好吗?

  5、 但这还不够。我们想要的是一个通用的方法。提交此表单后如何构造数字?直接删除就行了,就是%E6%97%85%打开E6%B8%B8&page=1后,效果是一样的。如果一些网站有影响,你可以找到更多的模式。

  6、 根据我们目前的信息,总结规则:

  页码

  #关于页码,需要说明一下,如果是第n页,填写页码n-1,第一页为0

  7、 可能出现乱码,需要修改chrome编码为utf8

  这个爬虫的python源代码:

  #encoding:utf8

# @Author lvpengbin

'''

爬取百度手机助手app_name示例代码,以爬取搜索关键字“旅游”返回结果的第二页为例 url:http://shouji.baidu.com/s?wd=旅游#page2

'''

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

import urllib2

from bs4 import BeautifulSoup

url='http://shouji.baidu.com/s?data_type=app&multi=0&ajax=1&wd=%E6%97%85%E6%B8%B8&page=1'

req_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',

'Accept':'*/*',

'Accept-Language':'zh-CN,zh;q=0.8',

'Connection':'close',

'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host

}#这里需要设置header,要不然系统默认的Accept-Language是英语,返回的页面是英文的

req_timeout = 5

req = urllib2.Request(url,None,req_header)

resp = urllib2.urlopen(req,None,req_timeout)

html = resp.read()

soup = BeautifulSoup(html)

nodes = soup.find_all("a",onclick="bd_app_dl(this,event);")

for node in nodes:

print node['data_name']

'''

输出:

优步 - Uber

蚂蜂窝自由行

飞常准

TripAdvisor

和生活

易到用车

爱城市

智行火车票-12306购票

TripAdvisor

淘在路上旅游

'''

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线