python爬取动态生成的网页——以百度手机助手为例

在爬取js动态生成的页面时,直接打开页面是获取不到内容的,比如,我在爬取百度手机助手的应用时,就遇到了这样一个问题。在搜索旅游类应用时,返回数据有几页的内容,但是不管你翻到第几页,查看源代码发现都一样,都是第一页内容的源代码。分析原因我觉得可能是这样的:假设百度应用一页内容有八个应用,你把查询提交后他把内容的前8个生成一个html,然后再你翻页时,通过js,ajax等方式替换原来的8个应用,比如你选择第五页时,把返回应用列表的33-40个应用替换原来的1-8的内容。(应该是ajax或者其他表单提交的方式可能性更大,因为纯js不涉及表单提交等后台交互的话,需要在第一次查询时就一次把所有结果返回存储在前端)【个人分析,欢迎指正】

文章思路参考自:http://www.3fwork.com/b401/000595MYM019975/感谢原作者

好了,现在我们目标明确了,找到对应的表达提交(或者js)动作就可以了。这里我们借助谷歌的 开发者工具。我们接下来操作是在谷歌浏览器进行的。

我们从头操作一遍:

1、打开手机助手搜索“旅游”,url: http://shouji.baidu.com/s?wd=旅游

我们得到一个搜索结果:为您搜索到:旅游 的应用结果 461 个

这时你可以查看一下源文件。

2、当我们翻一页时 url: http://shouji.baidu.com/s?wd=旅游#page2  发现源文件还是一样的,这便是动态加载造成的,那我们怎么抓后面的界面呢

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

这时里面没有内容,需要我们加载一次页面: url:http://shouji.baidu.com/s?wd=%E6%97%85%E6%B8%B8#page2

在保持开发者工具如上图的前提下,地址栏输入你要解析的页面url(比如上述url),然后就能看到内容了:

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

这里面的app名字就是我们想要爬取得第二页的app名字,这个就是我们最终想要的内容。

4、在左边那个红框上右键,可以copy链接:http://shouji.baidu.com/s?data_type=app&multi=0&ajax=1&wd=%E6%97%85%E6%B8%B8&page=1&_=1460652637109

打开这个链接我们发现,这个网页的源代码就是我们想要的(其实就是提交了表单)这样是不是很nice!

5、不过这样还不行,我们想要的是一个通用的方法,这个表单提交后面的那个数字该怎么去构造,这里面直接删除就好了,也就是说http://shouji.baidu.com/s?data_type=app&multi=0&ajax=1&wd=%E6%97%85%E6%B8%B8&page=1打开后效果一样,如果有的网站这个是有影响的,你可以多抓几个找规律。

6、通过我们目前的信息,总结一下规律:

http://shouji.baidu.com/s?data_type=app&multi=0&ajax=1&wd=app_name&page=页码

#关于页码,需要解释一下,如果是第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
淘在路上旅游
‘‘‘
时间: 2024-11-05 18:33:48

python爬取动态生成的网页——以百度手机助手为例的相关文章

java抓取动态生成的网页

最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架Nutch,使用起来是很方便,但是最后因为速度的原因放弃了,但生成的统计信息在后来的抓取中使用到了),很快holder.html和finance.html页面成功下载完成,然后解析完holder.html页面之后再解析finance.html,然后很沮丧的发现在这个页面中我需要的数据并没有在html

java抓取动态生成的网页--吐槽

最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架Nutch,使用起来是很方便,但是最后因为速度的原因放弃了,但生成的统计信息在后来的抓取中使用到了),很快holder.html和finance.html页面成功下载完成,然后解析完holder.html页面之后再解析finance.html,然后很沮丧的发现在这个页面中我需要的数据并没有在html

怎样用java编程抓取动态生成的网页

最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架Nutch,使用起来是很方便,但是最后因为速度的原因放弃了,但生成的统计信息在后来的抓取中使用到了),很快holder.html和finance.html页面成功下载完成,然后解析完holder.html页面之后再解析finance.html,然后很沮丧的发现在这个页面中我需要的数据并没有在html

python爬取动态网页

静态网页:根据url即可方便的爬取 动态网页:分为两种:一种是通过F12查看控制台的xhr等文件,找到包含所要爬取的内容的文件,发现这个文件的url路径跟页码有联系,那么就可以根据构造的url来进行访问爬取了.还有一种情况是查看了包含所要爬取内容的文件,发现文件url是固定不变的或者跟页码没有关系,这个时候可以通过简单的模拟浏览器点击行为来请求网页再爬取,这种方案执行效率较慢,不适于多页爬取的情况.代码如下: 1 def parse(self, response): 2 print 'parse

selenium+python爬取数据跳转网页

项目要做一个四个层级栏的数据抓取,而且点击查询后数据会在新跳出的网页. 源码如下 注释解释 from selenium import webdriver import selenium #from time import sleep as sp url='http://202.127.42.157/moazzys/nongqing.aspx' site=webdriver.Chrome() site.get(url) #data={} mainhandle=site.current_window

使用Ghost.py爬取由JS动态生成的网页

很多网站的内容是由JS动态生成的,对于这样的网站查看它的源代码是看不出什么的,常规的爬虫对于这样的网站束手无策.我自己做了一个由JS生成的图片,并成功的用Ghost.py把它爬取了下来. 对于这么个图片看似平常,那么看下它的源代码 从源代码里看不出关于这张图片的地址,而图片的地址是在后端,由JS加载进去的,爬取这类网站需要模拟浏览器执行JS语句,得到执行JS后的页面,再实现爬取. 这里需要用到一个工具:ghost.py ghost.py是一个使用python编写的封装了webkit的网络工具.官

python scrapy爬取动态页面

preface:最近学习工作之外,有个异性朋友需要爬取动态网页的要求,输入关键词爬取某个专利网站在该关键词下的一些专利说明.以往直接python urllib2可破,但是那只是对于静态网页可破,但是对于用js等其他的生成的动态网页的话,则貌似不行(没试过).然后在网上找了些资料,发现scrapy结合selenium包好像可以.(之所以这么说,暂时卤主也还没实现,先记录下来.) #=====================根据官网中简单的介绍作个人理解=======================

Python爬取网页信息

Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初始网址,逐层查找链接,直到找到需要获取的内容. 在打开的界面中,点击鼠标右键,在弹出的对话框中,选择“检查”,则在界面会显示该网页的源代码,在具体内容处点击查找,可以定位到需要查找的内容的源码. 注意:代码显示的方式与浏览器有关,有些浏览器不支持显示源代码功能(360浏览器,谷歌浏览器,火狐浏览器等

python爬取某个网页的图片-如百度贴吧

python爬取某个网页的图片-如百度贴吧 作者:vpoet 日期:大约在冬季 注:随意copy,不用告诉我 #coding:utf-8 import urllib import urllib2 import re if __name__ =="__main__": rex=r'src="(http://imgsrc.baidu.com/forum/w%3D580.*?\.jpg)"'; Response=urllib2.urlopen("http://t