Python爬虫抓取js添加到网页的图片

采用PyQt5+urllib3+BeautifulSoup4进行动态网页的图片抓取爬虫

    心血来潮,想在某个网站抓取图片,结果用requests下载下来,却发现,里面不含有图片,也就是说,图片全是由js等代码放到页面上去的,所以,requests下载的页面并没有执行js内容,于是就不能从里面找到所要的图片。为了解决这个问题,聪明的网友们发现用PyQt的网页相关模块可以解决这个问题,而不需要用selenium等模块操作浏览器,于是乎,参考了一些文章,终于达到了我的目的。于是在这里记录相关步骤,也可给各位一个参考。

本文基于以下环境和版本:
    Windows 7
    Python3.6.0 x32
    Python模块:
        beautifulsoup4==4.6.0
        urllib3==1.22
        PyQt5==5.10.1
        注:PyQt5.8.2也测试通过
        IDE:PyCharm3.2

首先,准备好测试用的HTML等文件
main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Main Page</title>
</head>
<body>
<div>这是主页</div>
<script type="text/javascript" src="./main.js"></script>
</body>
</html>

main.js

function dynamicImg(img_url)
{
    var div = document.createElement("div");
    div.innerText = img_url;

    var img = document.createElement("img");
    img.src = img_url;
    img.classList.add("test");
    document.body.appendChild(div);
    document.body.appendChild(img);
}
// 用js在页面上添加两张图片
dynamicImg("./test1.jpg");
dynamicImg("./test2.png");

图片请自己准备。将html,js,jpg等文件放到某个文件夹下,比如我的存放位置看下图浏览器地址栏。
本地用浏览器打开之后,效果如下(图片较大,截了一部分):
浏览器器打开测试网页效果
以下代码均在文件app.py中
以下代码用到的库:

import urllib.request
import urllib.response
import random
import bs4 as bs
import os
import sys
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
如果用request直接下载的效果:
def useRequestMethod(url):
    """
        传统方法不能下载动态网页
    """
    response = urllib.request.urlopen(url)
    with open("download.html", "w+", encoding="utf-8") as f:
        f.write(response.read().decode("utf-8"))


if __name__ == '__main__':
    url = "file:///E:/Code/Python/SimpleCrawler/CrawlerImageExample/main.html"
    useRequestMethod(url)

上述代码将下载的HTML存入了download.html中,打开看一下:
request直接下载效果
可以看到,下载下来的HTML并没有执行JS代码,导致HTML中根本不含图片链接,于是这个时候,就该PyQt5出场了。

使用PyQt5下载js执行过后的动态页面

这里封装了一个类,用PyQt5的QWebEnginePage去加载url并等url完全执行完毕后,得到这个url的整个HTML

class MyWebBrowser(QWebEnginePage):
    app = None
    # 类变量 QApplication
    # 实际测试时,若调用了多个MyWebBrowser对象(有先后顺序的调用)
    # 比如现在某些页面上,获取了所有包含图片的页面链接,再去打开这些链接上抓取图片
    # 容易在这一步 super(
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
Python爬虫是一种用于自动化获取网页数据的程序。它可以通过发送HTTP请求,解析HTML页面,并提取所需的信息。对于静态网页爬虫可以直接通过请求获取到页面的HTML代码,然后使用解析库(如BeautifulSoup)来提取所需的数据。但是对于动态网页,情况稍有不同。 动态网页是指在页面加载过程中,通过JavaScript等技术动态生成内容的网页。这些内容可能是通过Ajax请求获取的,或者是在页面加载完成后通过JavaScript代码生成的。因此,对于动态网页抓取,我们需要模拟浏览器行为来执行JavaScript代码,并获取最终生成的HTML内容。 在Python中,有一些库可以帮助我们实现动态网页抓取,其中比较常用的是Selenium和Pyppeteer。这两个库都可以模拟浏览器行为,并且支持执行JavaScript代码。你可以根据自己的需求选择其中一个进行使用。 使用Selenium进行动态网页抓取的基本步骤如下: 1. 安装Selenium库:使用pip命令安装selenium库。 2. 下载浏览器驱动:根据你使用的浏览器(如Chrome、Firefox等)下载对应的浏览器驱动,并将其添加到系统路径中。 3. 创建WebDriver对象:使用Selenium的WebDriver类创建一个浏览器对象,如ChromeDriver。 4. 打开网页:使用WebDriver对象的get方法打开目标网页。 5. 执行JavaScript代码:如果页面中有动态生成的内容,可以使用WebDriver对象的execute_script方法执行JavaScript代码。 6. 提取数据:使用Selenium提供的方法或者其他解析库(如BeautifulSoup)来提取所需的数据。 使用Pyppeteer进行动态网页抓取的基本步骤如下: 1. 安装Pyppeteer库:使用pip命令安装pyppeteer库。 2. 安装Chromium浏览器:Pyppeteer依赖于Chromium浏览器,需要先安装Chromium浏览器。 3. 创建Browser对象:使用Pyppeteer的launch方法创建一个浏览器对象。 4. 创建Page对象:使用Browser对象的newPage方法创建一个页面对象。 5. 打开网页:使用Page对象的goto方法打开目标网页。 6. 执行JavaScript代码:如果页面中有动态生成的内容,可以使用Page对象的evaluate方法执行JavaScript代码。 7. 提取数据:使用Pyppeteer提供的方法或其他解析库(如BeautifulSoup)来提取所需的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值