python爬取网页中javascript动态添加的内容(一)
来源:互联网 发布:西北师大知行学院贴吧 编辑:程序博客网 时间:2024/04/30 09:04
这几天刚好在学Requests和BeautifulSoup结合做爬虫爬取网页内容,恰巧有个哥们在群里问select函数里应该怎么来填?我想也是我在学,不妨找他一起做做,如果能帮人那最好不过啦。
好吧,进入正题
本次爬取的网址是:https://movie.douban.com/,采用的浏览器是Chrome,内容为下图类似于电影的名字、评分,以及图片链接等等。
1.首先按照传统的方法
当然首先的想法是按照传统的方法 = 获取源代码,解析网页,select网页标签取内容。
利用Chrome浏览器里的工具我们可以知道我们要爬取的内容存在于img标签里
# -*- coding:utf-8 -*-import requestsfrom bs4 import BeautifulSoupimport sysreload(sys)sys.setdefaultencoding('utf-8')url='https://movie.douban.com'res=requests.get(url)content = res.text # 获取网页源码soup=BeautifulSoup(content,'html.parser')for Img in soup.select('img'): #因为图片存在img标签里,因此select里选取img标签 print Img直接上代码,毕竟这不是今天我们要讲的主题。
结果你会发现这并不是我们想要的内容。
为什么会这样呢?明明就是那个网址,那个标签,会不会我代码有问题,直接对比了网页源码和网页页面右键的源码,发现两个内容是有差别的,被隐藏了一些内容(那些内容正是我所想要的)
后来百度了解到,这是由于网页中加载了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
调用写好的一个类
class Render(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.fr ame = self.mainFrame() self.app.quit()调用写好的类便可以解析出网页真正的源代码了(也就是包括js加载的内容)
总之首要任务就是先解析整个网页再说
#-*- coding:utf-8 -*-import sysfrom HTMLParser import HTMLParserfrom bs4 import BeautifulSoupfrom PyQt4.QtWebKit import *from PyQt4.QtGui import *from PyQt4.QtCore import *class Render(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()print html好了,成功解析出整个网页源代码,包括我们要的内容也在里面。
但是此时还不能直接用BeautifulSoup里select标签,因为你print下html变量的类型就知道
html = r.frame.toHtml()print type(html)html = html.toUtf8()print type(html)<class 'PyQt4.QtCore.QString'>
<class 'PyQt4.QtCore.QByteArray'>
这种界面类型的变量是无法用于BeautifulSoup类的
soup=BeautifulSoup(html,'html.parser')直接用,直接报错
declared_encoding = declared_encoding_match.groups()[0].decode(
AttributeError: 'QByteArray' object has no attribute 'decode'
AttributeError: 'QByteArray' object has no attribute 'decode'
因此我们需要了解下,参考http://blog.sina.com.cn/s/blog_4b5039210100h9kp.html里面Python String和PyQt QString的区别以及之间的转换
html = unicode(html,'utf8','ignore')我们只要添加这条语句即可
我们可以按照传统的方法解析我们的标签了
贴上完整代码
#-*- coding:utf-8 -*-import sysfrom HTMLParser import HTMLParserfrom bs4 import BeautifulSoupfrom PyQt4.QtWebKit import *from PyQt4.QtGui import *from PyQt4.QtCore import *class Render(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转为我们所需要的python unicode类型soup=BeautifulSoup(html,'html.parser')for item in soup.select('img'): print item['alt']+" "+item['src'] #获取img标签下图片 以及名字信息
3.感想,未完待续
第一次写,欢迎转载! 也希望大家多多喷我,同时给我意见指正。写完我发现还有两个问题
1.程序运行有点慢,觉得应该是加载PyQt包太大了,或许还有更好的包,或许我还可以单独只提取包里单独的模块。
2.网页上有个“加载更多”的没法解决,也就是说一个网页爬取的内容有限,或许后面我应该学习下如何实现点击那个加载更多的按钮。
最后衷心希望大家和我交流。
1 0
- python爬取网页中javascript动态添加的内容(一)
- python爬取网页中javascript动态添加的内容(二)
- python解析网页中javascript动态添加的内容 一
- python解析网页中javascript动态添加的内容
- 爬取网页动态内容
- python+selenium+PhantomJS爬取网页动态加载内容
- python爬取网页内容
- 简单的python爬取网页字符串内容并保存
- Python 爬取网页内容,转成PDF
- python urllib2 爬取网页内容
- 网络爬虫:爬取动态网页(例如javascript)
- 爬取动态的网页。
- python爬虫进阶(二):动态网页爬取
- python爬取百度搜索动态网页
- python爬取静态和动态网页
- python + Scrapy 爬取动态网页
- 工作问题积累(十六)动态改变网页中的内容,向网页中添加文本
- Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)
- Distributed Representations of Words and Phrasesand their Compositionality
- 同时使用parceler/butterknife/dagger2出现DuplicateFileException的解决方法
- [LeetCode]198. House Robber
- 消息游标
- 第十四周 折半查找算法的验证
- python爬取网页中javascript动态添加的内容(一)
- MarkdownPad 2 Pro 注册码与注册私钥,Windows平台Markdown编辑器
- jQuery制作无缝轮播
- js闭包的概念
- 编码的验证gbk,utf...
- Linux 驱动之模块参数和符号导出
- Android开发艺术探索笔记(3)- 进程和线程
- jdbc 规范
- 1111