python 制作动态网页的区别_Python 怎么爬取动态网页js生成的数据?

这几天刚好在学Requests和BeautifulSoup结合做爬虫爬取网页内容,恰巧有个哥们在群里问select函数里应该怎么来填?我想也是我在学,不妨找他一起做做,如果能帮人那最好不过啦。

好吧,进入正题

本次爬取的网址是:https://movie.douban.com/,采用的浏览器是Chrome,内容为下图类似于电影的名字、评分,以及图片链接等等。

首先按照传统的方法

当然首先的想法是按照传统的方法=获取源代码,解析网页,select网页标签取内容。

利用Chrome浏览器里的工具我们可以知道我们要爬取的内容存在于img标签里

#-*-coding:utf-8-*-

importrequests

frombs4importBeautifulSoup

importsys

reload(sys)

sys.setdefaultencoding('utf-8')

url='https://movie.douban.com'

res=requests.get(url)

content=res.text#获取网页源码

soup=BeautifulSoup(content,'html.parser')

forImginsoup.select('img'):#因为图片存在img标签里,因此select里选取img标签

printImg

直接上代码,毕竟这不是今天我们要讲的主题。

结果你会发现这并不是我们想要的内容。

为什么会这样呢?明明就是那个网址,那个标签,会不会我代码有问题,直接对比了网页源码和网页页面右键的源码,发现两个内容是有差别的,被隐藏了一些内容(那些内容正是我所想要的)

后来百度了解到,这是由于网页中加载了javascript动态标签所导致的。那么问题来了,我们就不能按照传统的方法爬取javascript动态加载的内容了。

2.采取PyQt4+BeautifulSoup方法

大家觉得不懂可以先去了解什么是Javascript动态加载,我理解的意思大概就是有个js文件加载到网页里,我没学过这部分内容,欢迎大家指正喷我。

大家也可以先看这篇文章

http://www.cnblogs.com/asmblog/archive/2013/05/07/3063809.html

大概原理就是利用PyQt4包里的

webkit模块就能解析js文件了。

首先你需要下载PyQt4包,但是我发现在dos界面下没法pip安装,没办法喽,你只能手动安装

直接给大家网址吧,免得大家找的辛苦:https://riverbankcomputing.com/software/pyqt/download

调用写好的一个类

classRender(QWebPage):

def__init__(self,url):

self.app=QApplication(sys.argv)

QWebPage.__init__(self)

self.loadFinished.connect(self._loadFinished)

self.mainFrame().load(QUrl(url))

self.app.exec_()

def_loadFinished(self,result):

self.frame=self.mainFrame()

self.app.quit()调用写好的类便可以解析出网页真正的源代码了(也就是包括js加载的内容)

总之首要任务就是先解析整个网页再说

#-*-coding:utf-8-*-

importsys

fromHTMLParserimportHTMLParser

frombs4importBeautifulSoup

fromPyQt4.QtWebKitimport*

fromPyQt4.QtGuiimport*

fromPyQt4.QtCoreimport*

classRender(QWebPage):

def__init__(self,url):

self.app=QApplication(sys.argv)

QWebPage.__init__(self)

self.loadFinished.connect(self._loadFinished)

self.mainFrame().load(QUrl(url))

self.app.exec_()

def_loadFinished(self,result):

self.frame=self.mainFrame()

self.app.quit()

url='https://movie.douban.com'

r=Render(url)

html=r.frame.toHtml()

html=html.toUtf8()

printhtml

好了,成功解析出整个网页源代码,包括我们要的内容也在里面。

但是此时还不能直接用BeautifulSoup里select标签,因为你print下html变量的类型就知道

html=r.frame.toHtml()

printtype(html)

html=html.toUtf8()

printtype(html)

这种界面类型的变量是无法用于

BeautifulSoup类的

soup=BeautifulSoup(html,'html.parser')直接用,直接报错

declared_encoding=declared_encoding_match.groups()[0].decode(AttributeError:'QByteArray'objecthasnoattribute'decode'

因此我们需要了解下,参考

http://blog.sina.com.cn/s/blog_4b5039210100h9kp.html里面

Python String和PyQt QString的区别以及之间的转换

html=unicode(html,'utf8','ignore')我们只要添加这条语句即可

我们可以按照传统的方法解析我们的标签了

贴上完整代码

#-*-coding:utf-8-*-

importsys

fromHTMLParserimportHTMLParser

frombs4importBeautifulSoup

fromPyQt4.QtWebKitimport*

fromPyQt4.QtGuiimport*

fromPyQt4.QtCoreimport*

classRender(QWebPage):

def__init__(self,url):

self.app=QApplication(sys.argv)

QWebPage.__init__(self)

self.loadFinished.connect(self._loadFinished)

self.mainFrame().load(QUrl(url))

self.app.exec_()

def_loadFinished(self,result):

self.frame=self.mainFrame()

self.app.quit()

url='https://movie.douban.com'

r=Render(url)

html=r.frame.toHtml()

html=html.toUtf8()

html=unicode(html,'utf8','ignore')#把html转为我们所需要的pythonunicode类型

soup=BeautifulSoup(html,'html.parser')

foriteminsoup.select('img'):

printitem['alt']+""+item['src']#获取img标签下图片以及名字信息

3.感想,未完待续

第一次写,欢迎转载!也希望大家多多喷我,同时给我意见指正。写完我发现还有两个问题

程序运行有点慢,觉得应该是加载PyQt包太大了,或许还有更好的包,或许我还可以单独只提取包里单独的模块。

2.网页上有个“加载更多”的没法解决,也就是说一个网页爬取的内容有限,或许后面我应该学习下如何实现点击那个加载更多的按钮。

最后衷心希望大家和我交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值