网络爬虫之动态内容爬取

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


相关推荐

  • vue生成二维码_html生成二维码

    vue生成二维码_html生成二维码目录qrcodejs2vue-qrqrcodejs2下载qrcodejs2cnpmi-Sqrcodejs2使用<template><spanref=”qrCodeUrl”></span></template><script>importQRCodefrom”qrcodejs2″;exportdefault{data(){return{};},mo

    2022年10月4日
    3
  • springboot里面的porm配置问题

    springboot里面的porm配置问题本地jar包直接通过自建目录的方式加入MAVEN是行不通的,install项目的时候会出现该jar包missing问题。解决方式:通过控制台用命令行的方式加入。比如:mvninstall:install-file-Dfile=D:\workSpaceGD\DcloudServices\WebRoot\WEB-INF\lib\json-lib-2.4-jdk15.jar-Dgrou…

    2022年6月18日
    44
  • 剑指java面试offer直通车_面试后一般多久给offer

    剑指java面试offer直通车_面试后一般多久给offer这是本人整理的数万字的面试笔记,基本上涵盖了Java领域的所有技术栈,本人也是凭借这份面试笔记斩获了近10个offer,面试成功率高达80%。当然这份笔记是我根据自身的经验和技术栈整理的,自己觉得很重要的或者记不清的就会记录记录下来,面试被问到的时候也有回答的思路。现在共享给大家,希望对准备面试的小伙伴有帮助。1.微服务1.1主流注册中心对比zookeeper:zookeeper作为注册中心主要是因为它具有节点变更通知功能。只要客户端监听相关服务节点,服务节点有所变更就能及时的通知到监

    2022年9月16日
    3
  • 如何理解系统平均负载值(一)

    如何理解系统平均负载值(一)如何理解系统平均负载值(一)1.引你们好,可爱的小伙伴们^_^。每当我们发现系统变慢时,通常做的第一件事,就是执行top或者uptime命令,来了解系统的负载情况。比如下面这样,我在命令行里输

    2022年7月2日
    28
  • 重建二叉树(Java)

    重建二叉树(Java)题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。链表的结点定义如下:structListNode{ intm_nKey; ListNode*m_pNext;}第一思路:我的第一思路是从头到尾输出类比数组那样,于是乎想把链表中的链表结点的指针反转过来,改变链表的方向,然后实现从头到尾输出(结果为从尾到头输出),可是发现修改链表的指针,反转链表的结构比较麻烦。于是乎放弃。最优…

    2022年6月14日
    29
  • Linux futex_centos8 pip

    Linux futex_centos8 pipPriorityInheritance,优先级继承,是解决优先级反转的一种办法。一个经典的例子:A/B/C三个实时进程,优先级A>B>C。C持有a锁,而A等待a锁被挂起。原本C释放a锁之后,A进程就可以继续执行的,但是偏偏有个比C优先级高的B进程存在,导致C得不到运行,也就没法释放a锁,从而导致A进程一直挂起。从整体上看,进程B虽然比A优…

    2022年9月16日
    3

发表回复

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

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