python爬取动态网页-python爬虫爬取网页所有数据
这几天刚好在学习Requests和BeautifulSoup的结合作为爬虫来爬取网页内容。 正好有小伙伴在群里问select函数怎么填? 我觉得我也在学习,不妨找他一起做。 如果我能帮助别人,那就太好了。
好的,让我们进入正题
本次抓取的URL为:,使用的浏览器为Chrome,内容类似下图中的电影名称、评分、图片链接。
先按照传统方法
当然,第一个思路是按照传统的方式=获取源码python爬取动态网页,解析网页,选择网页标签获取内容。
使用Chrome浏览器中的工具,我们可以知道img标签中存在我们要抓取的内容
#-*-编码:utf-8-*-
导入请求
来自bs4importBeautifulSoup
导入系统
重新加载(系统)
sys.setdefaultencoding('utf-8')
网址='#39;
资源=请求。 得到(网址)
content=res.text#获取网页源代码
soup=BeautifulSoup(content,'html.parser')
forImginsoup.select('img'): #因为img标签中存在图片,所以在select中选择img标签
打印图像
直接上代码,毕竟这不是我们今天要讲的主题。
结果你会发现这不是我们想要的。
为什么会这样? 明明就是那个网址,那个标签,是不是我的代码有问题? 我直接将网页的源代码和网页右键的源代码进行对比,发现两者的内容不一样,隐藏了一些内容(那些内容正是我想的。需要的)
后来百度才知道这是网页加载javascript动态标签造成的。 那么问题来了,我们无法按照传统的方式爬取javascript动态加载的内容。
2.采用PyQt4+BeautifulSoup方式
不明白的可以先了解一下什么是Javascript动态加载。 我的理解是网页中加载了一个js文件。 这部分我没学过。 欢迎指正。
你也可以先阅读这篇文章
大概原理是使用PyQt4包
webkit模块可以解析js文件。
首先需要下载PyQt4包python爬取动态网页,但是我发现在dos界面下无法用pip安装。 没办法,只能手动安装
直接给你网址,免得你费劲去找:
调用书面类
类渲染器(QWebPage):
def__init__(自我,网址):
self.app=QApplication(sys.argv)
QWebPage.__init__(自我)
self.loadFinished.connect(self._loadFinished)
自己。 主框架()。 加载(QUrl(网址))
self.app.exec_()
def_loadFinished(自我,结果):
self.frame = self.mainFrame()
self.app.quit()调用写好的类解析出网页真正的源码(也就是包含js加载的内容)
总之,首要任务就是先分析整个网页。
#-*-编码:utf-8-*-
导入系统
从 HTMLParser 导入 HTMLParser
来自bs4importBeautifulSoup
从 PyQt4.QtWebKit 导入*
从 PyQt4.QtGui 导入*
从 PyQt4.QtCore 导入*
类渲染器(QWebPage):
def__init__(自我,网址):
self.app=QApplication(sys.argv)
QWebPage.__init__(自我)
self.loadFinished.connect(self._loadFinished)
自己。 主框架()。 加载(QUrl(网址))
self.app.exec_()
def_loadFinished(自我,结果):
self.frame = self.mainFrame()
self.app.quit()
网址='#39;
r=渲染(网址)
html = r. 框架。 toHtml()
html=html.toUtf8()
打印html
好了,整个网页的源码都解析成功了,包括了我们要的内容。
但是此时不能直接使用BeautifulSoup中的select标签,因为通过打印就可以知道html变量的类型
html = r. 框架。 toHtml()
打印类型(html)
html=html.toUtf8()
打印类型(html)
此接口类型的变量不能用于
BeautifulSoup 类的
直接用soup=BeautifulSoup(html,'html.parser'),直接报错
declared_encoding=declared_encoding_match.groups()[0].decode(AttributeError: 'QByteArray' 对象没有属性 'decode'
因此,我们需要了解,参考
在
Python String 和 PyQt QString 的区别以及它们之间的转换
html=unicode(html,'utf8','ignore') 我们只需要添加这条语句
我们可以用传统的方式解析我们的标签
粘贴完整代码
#-*-编码:utf-8-*-
导入系统
从 HTMLParser 导入 HTMLParser
来自bs4importBeautifulSoup
从 PyQt4.QtWebKit 导入*
从 PyQt4.QtGui 导入*
从 PyQt4.QtCore 导入*
类渲染器(QWebPage):
def__init__(自我,网址):
self.app=QApplication(sys.argv)
QWebPage.__init__(自我)
self.loadFinished.connect(self._loadFinished)
自己。 主框架()。 加载(QUrl(网址))
self.app.exec_()
def_loadFinished(自我,结果):
self.frame = self.mainFrame()
self.app.quit()
网址='#39;
r=渲染(网址)
html = r. 框架。 toHtml()
html=html.toUtf8()
html=unicode(html,'utf8','ignore')#将html转换成我们需要的pythonunicode类型
soup=BeautifulSoup(html,'html.parser')
富丽明汤。 选择('img'):
printitem['alt']+""+item['src']#获取img标签下的图片和名称信息
3.思考,待续
第一次写,欢迎转发! 也希望大家多多喷我,同时给我意见和指正。写完之后发现还有两个问题
程序运行有点慢。 我想应该是加载的PyQt包太大了。 也许有更好的包装。 也许我可以只提取包中的各个模块。
2、网页上有个“加载更多”的问题无法解决,也就是说一个网页爬取的内容是有限的,也许以后应该学习一下如何点击加载更多按钮。
最后,真心希望大家可以和我交流。