当前位置: 主页 > Python语言

python爬取动态网页-python爬虫爬取网页所有数据

发布时间:2023-02-09 14:18   浏览次数:次   作者:佚名

这几天刚好在学习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标签

打印图像

python爬取动态网页_python如何爬取动态网页_python爬虫爬取网页所有数据

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

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

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

后来百度才知道这是网页加载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(网址))

python如何爬取动态网页_python爬取动态网页_python爬虫爬取网页所有数据

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(网址))

python爬取动态网页_python如何爬取动态网页_python爬虫爬取网页所有数据

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'),直接报错

python爬虫爬取网页所有数据_python爬取动态网页_python如何爬取动态网页

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__(自我)

python如何爬取动态网页_python爬虫爬取网页所有数据_python爬取动态网页

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、网页上有个“加载更多”的问题无法解决,也就是说一个网页爬取的内容是有限的,也许以后应该学习一下如何点击加载更多按钮。

最后,真心希望大家可以和我交流。