爬虫之动态获取数据

Posted clbao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫之动态获取数据相关的知识,希望对你有一定的参考价值。

一.图片懒加载

图片懒加载概念:

  图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。

  网站一般如何实现图片懒加载技术呢?在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。站长素材案例后续分析:通过细致观察页面的结构后发现,网页中图片的链接是存储在了src2这个伪属性中

案例: 

1. 抓取站长素材http://sc.chinaz.com/中的图片数据

  

 import requests
 from urllib import request
 import re
 import os

#1.检查页面数据是否为动态加载出来的
#2.获取页面源码数据
if not os.path.exists(tupian):
    os.mkdir(tupian)

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}

url = "http://sc.chinaz.com/tupian/shanshuifengjing.html"
page_text = requests.get(url=url, headers=headers).text
# print(page_text)

ex = <img src2="(.*?)" alt=.*?></a>
img_url_list = re.findall(ex, page_text, re.S)
# print(img_url_list)
for i in img_url_list:
    img_url = i
    img_url = img_url[:-7] + ".jpg"
    print(img_url)
    img_path = tupian/ + i.split(/)[-1].split(".")[0][:-2] + ".jpg"
    print(img_path)
    request.urlretrieve(url=img_url, filename=img_path)
    print(img_path+下载成功!!!)

2.煎蛋网爬取图片、

from urllib import request
import requests
import base64
from lxml import etree
import os
headers = {
    User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
}
if not os.path.exists(jiandan):
    os.mkdir(jiandan)
    
url = http://jandan.net/ooxx/page-46#comments
page_text = requests.get(url=url,headers=headers).text

#解析scr的密文数据
#查看页面源码:发现所有图片的src值都是一样的。
#简单观察会发现每张图片加载都是通过jandan_load_img(this)这个js函数实现的。
#在该函数后面还有一个class值为img-hash的标签,里面存储的是一组hash值,该值就是加密后的img地址
#加密就是通过js函数实现的,所以分析js函数,获知加密方式,然后进行解密。
#通过抓包工具抓取起始url的数据包,在数据包中全局搜索js函数名(jandan_load_img),然后分析该函数实现加密的方式。
#在该js函数中发现有一个方法调用,该方法就是加密方式,对该方法进行搜索
#搜索到的方法中会发现base64和md5等字样,md5是不可逆的所以优先考虑使用base64解密
tree = etree.HTML(page_text)
src_code_list = tree.xpath(//span[@class="img-hash"]/text())
for src_code in src_code_list:
    src = https:+base64.b64decode(src_code).decode()
    img_path = jiandan/+src.split(/)[-1]
    request.urlretrieve(url=src,filename=img_path)
    print(img_path+下载完毕!!!)

 

3.梨视频爬取视屏

import requests
from urllib import request
import re
import os, time
from lxml import etree
import random

headers = {
    User-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36,
    Connection:close
}

url = https://www.pearvideo.com/video_1502773


if not os.path.exists(video):
    os.mkdir(video)
    
    
response = requests.get(url,headers)
response.encoding = utf-8
text = response.text

tree = etree.HTML(text)
url = tree.xpath(//*[@id="detailsbd"]/div[1]/script[1]/text())[0]
name = tree.xpath(//*[@id="detailsbd"]/div[1]/div[2]/div/div[1]/h1/text())[0]
print(name)
ex = srcUrl="(.*?)"
url = re.findall(ex,url)[0]

file_data = requests.get(url,headers).content

with open(f"video/{name}",wb) as f:
    f.write(file_data)
    print(下载成功)

 

以上是关于爬虫之动态获取数据的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫-27-python之Selenium入门,动态网页抓取

scrapy按顺序启动多个爬虫代码片段(python3)

爬虫实战:爬虫之 web 自动化终极杀手 ( 上)

2017.07.28 Python网络爬虫之爬虫实战 今日影视2 获取JS加载的数据

爬虫之selenium

python爬虫怎么获取动态的网页源码