网络爬虫之动态内容爬取

根据联合国网站可访问性审计报告,73%的主流网站都在其重要功能中依赖JavaScript。和单页面应用的简单表单事件不通,使用JavaScript时,不再是加载后立即下载所有页面内容。这样会造成许多网

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  根据联合国网站可访问性审计报告,73%的主流网站都在其重要功能中依赖JavaScript。和单页面应用的简单表单事件不通,使用JavaScript时,不再是加载后立即下载所有页面内容。这样会造成许多网页在浏览其中展示的内容不会出现在HTML源码中,针对于这种依赖于JavaScript的动态网站,我们需要采取相应方法,比如JavaScript逆向工程、渲染JavaScript等方法。

1. 动态网页示例

  网络爬虫之动态内容爬取

  如上图,打开智联招聘主页,输入python,搜索会出现上面的页面,现在我们爬取上图红色标记出的链接地址

  首先分析网页,获取该位置的div元素信息,我这里使用的是firefox浏览器,按F12

  网络爬虫之动态内容爬取

  看上图,红色标记就是我们要获取的链接地址,现在用代码获取该处链接试试看

import requests
from bs4 import BeautifulSoup as bs

url = 'https://sou.zhaopin.com/?jl=736&kw=python&kt=3'
reponse = requests.get(url)
soup = bs(reponse.text,"lxml")
print(soup.select('span[title="JAVA软件工程师"]'))
print(soup.select('a[class~="contentpile__content__wrapper__item__info"]'))

  输出结果为:[ ] [ ]

  表示这个示例爬虫失败了,检查源码也会发现我们抓取的元素实际是空的,而firefox显示给我们的却是网页当前的状态,也就是使用JavaScript动态加载玩搜索结果后的网页。

2. 对动态网页进行逆向工程

  在firefox中按F12单击控制台,打开XHR

网络爬虫之动态内容爬取

  依次点开,并查看响应出内容

网络爬虫之动态内容爬取

  会发现最后一行有我们要的内容,继续点开results的索引0

  网络爬虫之动态内容爬取

  很好,这就是我们要找的信息

  接下来我们就可以对第三行的网址进行爬虫处理并获取我们的想要的json信息。

3. 代码实现

  接下来提取首页jobName中包含python的所有链接:

import requests
import urllib
import http
import json

def format_url(url, start=0,pagesize=60,cityid=736,workEXperience=-1,
            education=-1,companyType=-1,employmentType=-1,jobWelfareTag=-1,
            kw="python",kt=3):
    url = url.format(start,pagesize,cityid,workEXperience,education,companyType,\
                    employmentType,jobWelfareTag,kw,kt)
    return url;

def ParseUrlToHtml(url,headers):
    cjar = http.cookiejar.CookieJar()
    opener = urllib.request.build_opener(urllib.request.HTTPSHandler, urllib.request.HTTPCookieProcessor(cjar))
    headers_list = []
    for key,value in headers.items():
        headers_list.append(key)
        headers_list.append(value)
    opener.add_headers = [headers_list]
    html = None
    try:
        urllib.request.install_opener(opener)
        request = urllib.request.Request(url)
        reponse = opener.open(request)
        html = reponse.read().decode('utf-8')
    except urllib.error.URLError as e:
        if hasattr(e, 'code'):
            print ("HTTPErro:", e.code)
        elif hasattr(e, 'reason'):
            print ("URLErro:", e.reason)
        
    return opener,reponse,html

'''print(ajax)
        with open("zlzp.txt", "w") as pf:
            pf.write(json.dumps(ajax,indent=4))'''
if __name__ == "__main__":
    url = 'https://fe-api.zhaopin.com/c/i/sou?start={}&pageSize={}&cityId={}'\
            '&workExperience={}&education={}&companyType={}&employmentType={}'\
            '&jobWelfareTag={}&kw={}&kt={}&_v=0.11773497'\
            '&x-zp-page-request-id=080667c3cd2a48d79b31528c16a7b0e4-1543371722658-50400'
            
    headers = {"Connection":"keep-alive",
                "Accept":"application/json, text/plain, */*",
               'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'}

    opener,reponse,html = ParseUrlToHtml(format_url(url), headers)
    if reponse.code == 200:
        try:
            ajax = json.loads(html)
        except ValueError as e:
            print(e)
            ajax = None
        else:
            results = ajax["data"]["results"]
            for result in results:
                if -1 != result["jobName"].lower().find("python"):
                    print(result["jobName"],":",result["positionURL"])
                

   输出:

网络爬虫之动态内容爬取

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120049.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月29日 下午9:00
下一篇 2021年12月29日 下午9:00


相关推荐

  • 超详细LinkedHashMap解析

    超详细LinkedHashMap解析文章目录 LinkedHashMa 概述 LinkedHashMa 原理主要元素构造函数维护链表的操作 afterNodeRem 操作 put 操作 HashMap putVal Remove 操作 HashMap removeNode LinkedHashMa 用作实现 LRU 总结 LinkedHashMa 概述 pub

    2026年3月19日
    2
  • 主流内存数据库功能特性和性能比较

    主流内存数据库功能特性和性能比较内存数据库从范型上可以分为关系型内存数据库和键值型内存数据库 在实际应用中内存数据库主要是配合 oracle 或 mysql 等大型关系数据库使用 关注性能 作用类似于缓存 并不注重数据完整性和数据一致性 基于键值型的内存数据库比关系型更加易于使用 性能和可扩展性更好 因此在应用上比关系型的内存数据库使用更多 本文首先比较 FastDB Memcached 和 Redis 主流内存数据库的功能特性 再从性能上比较

    2026年3月16日
    2
  • Claude Code 安装使用教程

    Claude Code 安装使用教程

    2026年3月15日
    2
  • 固态硬盘分为哪几种_通俗易懂 SSD固态硬盘接口有哪几种类型的图解

    固态硬盘分为哪几种_通俗易懂 SSD固态硬盘接口有哪几种类型的图解说起固态硬盘 小编之前为大家介绍了很多了 当然 大家也都知道 固态硬盘 英文简称 SSD 是一种采用固态电子存储芯片阵列而制成的硬盘 其接口规范和定义 功能及使用方法上与普通硬盘的完全相同 但读取速度更快 解决了新时代传统机械硬盘的性能瓶颈 已经成为新装机或者主流笔记本标配 那么今天 组装电脑下普遍主要为是大家科普一下固态硬盘接口知识 让广大电脑用户了解 SSD 固态硬盘接口类型 以下是通俗易懂的图文详

    2026年3月4日
    3
  • 快商通肖龙源:从智能客服到智能营销,客服中心迎来价值升级节点

    快商通肖龙源:从智能客服到智能营销,客服中心迎来价值升级节点营销智能化市场有多大 根据艾瑞研究的最新报告显示 自 2017 年开始 每年保持在 14 的增速在扩张 并且到 2021 年将成为 2 万亿级别的市场 简单去理解营销智能化 就是以科技化的工具来提升获客效率 在产业市场中 红海总比蓝海多 红海的竞争 在获客和管理工具上优化 意味着效率和整体利润的提升 任何一个企业主对于如何提升获客效率都是渴求的 近年来 消费医疗渐渐发展为红海市场 获客成本日益飙升 而更加透明的市场环境 价格战等也带来了客单价的下滑 如何更低成本地投放获客 成为了创造利润的命脉 快商通董事长肖龙源分享了

    2026年3月18日
    2
  • openclaw本地部署,openclaw平替windows安装

    openclaw本地部署,openclaw平替windows安装

    2026年3月13日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号