网络爬虫之动态内容爬取

根据联合国网站可访问性审计报告,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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 购物车功能模块设计图_超市购物车设计

    购物车功能模块设计图_超市购物车设计一、 需求分析 一:购物车模块功能需求 客户在浏览网页的时候,当遇到喜欢的商品、又不急于结账而是继续浏览货物时。需要一个购物篮来存储她已经选中的商品。以便于结账或用于对比商品的详细参数。用户在购物车页面中需要对购物车中的商品添加数量、移除商品、清空购物车等功能。

    2025年5月26日
    0
  • #pragma region、{}

    #pragma region、{}

    2021年11月19日
    43
  • Redis 6379端口无法telnet登陆

    Redis 6379端口无法telnet登陆一、现象:Redis所在服务器无法telnet 二、问题原因  redis-server默认开放的127.0.0.1IP地址需要修改为0.0.0.0才可以被其他机器访问三、解决办法(Windows)  1,在Redis安装目录下找到配置文件 redis.windows.config  2,修改bind127.0.0.1改为bind0.0.0.0    3,重启Redis…

    2022年5月2日
    119
  • offes破解2022激活码(注册激活)「建议收藏」

    (offes破解2022激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    88
  • 赵青-《剑侠情缘网络版》开发回顾

    赵青-《剑侠情缘网络版》开发回顾赵青-《剑侠情缘网络版》开发回顾 赵青-《剑侠情缘网络版》开发回顾,(转自剑网1,作者应该是原剑网3技术总监)这篇文章首发于一本谈游戏研发的杂志,是赵青写的,写得非常不错。《剑侠情缘网络版》开发回顾2003年的1月,我刚刚开发完《天王》项目,正在休息、总结和规划下一个项目。《天王》是我开发的众多项目中最满意的一个,虽然这篇文字主要是对《剑侠…

    2022年7月19日
    13
  • 百度2015校园招聘前端笔试题(西安站)

    百度2015校园招聘前端笔试题(西安站)

    2021年12月15日
    40

发表回复

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

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