逆向爬虫06 bs4,xpath,pyquery实战

2023-10-26

逆向爬虫06 bs4,xpath,pyquery实战

​ 原本想要详细的对比一下这三个模块的使用方法,但是在实战的时候发现,只要遵循一个套路,抓取静态网页(即网页信息直接放在html源代码中),就比较容易了,一些使用细节上的问题,每个人遇到的都会不一样,只有自己实实在在去练习了,才能掌握这三个工具。

​ 套路就是遵循路飞学城逆向爬虫课程第二章数据解析中,《xpath实战案例_猪八戒》《pyquery实战案例》两节视频中的方法,懒得说了,大家自己慢慢练吧,这玩意儿光看不练是没用的。

​ 下面直接上代码,仅供学习使用,代码可能具有时效性,过段时间若html代码结构发生变化,就不好用了。

bs4抓取猪八戒招标大厅的外包任务信息
"""
    目标:爬猪八戒招标大厅中的 价格,任务标题,任务详情
    url: https://task.zbj.com/page1.html
"""
import requests
from bs4 import BeautifulSoup
import time

def get_html_source(url):
    resp = requests.get(url)
    resp.encoding = "utf-8"
    # with open("source.html", mode="w", encoding="utf-8") as f:
    #     f.write(resp.text)
    return resp.text

def get_data_from_html(html):
    page = BeautifulSoup(html, "html.parser")
    div_list = page.find_all("div", attrs={"class": "result-search-item"})
    # with open("result-search-item.html", mode="w", encoding="utf-8") as f:
    #     f.write(str(div_list))
    for div in div_list:
        h4 = div.find("h4")
        work_title = h4.get("title")
        div_detail = div.find("div", attrs={"class": "pub-desc text-line-overflow-two"})
        work_detail = div_detail.text
        span_price = div.find("span", attrs={"class": "price"})
        price = span_price.text
        work_detail = work_detail.replace("\n", "")
        # print(f"{price},{work_title},{work_detail}")
        with open("result.csv", mode="a", encoding="utf-8") as f:
            f.write(f"{price},{work_title},{work_detail}\n")

if __name__ == "__main__":
    for i in range(3400):	# 根据招标大厅下面的总页数来填写
        url = f"https://task.zbj.com/page{i+1}.html"
        html = get_html_source(url)
        get_data_from_html(html)
        time.sleep(3)
    print("猪八戒招标大厅信息爬取完成!")
xpath抓取程序员客栈的程序员信息
"""
    目标:爬程序员客栈上程序员的信息
    url: https://www.proginn.com/cat/page/1/
"""

import requests
from lxml import etree
import time

def get_html_source(url):
    headers = {
        # 添加一个请求头信息UA,如果没有请求头,目标服务器会拒绝我们访问,这是一个最简单的反爬手段,只需要在http请求头中添加浏览器信息,就可以骗过目标服务器。
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57"
    }
    resp = requests.get(url, headers=headers)
    resp.encoding = "utf-8"
    # with open("source.html", mode="w", encoding="utf-8") as f:
    #     f.write(resp.text)
    return resp.text

def get_data_from_html(html):
    et = etree.HTML(html)
    user_info = '/html/body/div[@class="main"]/div[@class="main_body"]/div/div[@class="ui divided items proginn-user-list"]/div[@class="item J_user"]/div[@class="user-info fl"]'
    name_list = et.xpath(user_info + '/div[@class="title"]/a/span/text()')
    skill_list = et.xpath(f"{user_info}/div[2]/p[2]/span/text()|{user_info}/div[2]/p[2]/span[not(text())]")
    workspace_list = et.xpath(f"{user_info}/div[2]/div/div[1]/span[2]/text()|{user_info}/div[2]/div/div[1]/span[not(text())]")
    worktime_list = et.xpath(user_info + '/div[2]/div/div[2]/span[2]/text()')
    salary_list = et.xpath('/html/body/div[@class="main"]/div[@class="main_body"]/div/div[@class="ui divided items proginn-user-list"]/div[@class="item J_user"]/div[@class="hire-info fl"]/p[1]/span/text()')
    href = et.xpath(user_info + '/div[@class="title"]/a/@href')
    for idx in range(15):
        detail_html = get_html_source(href[idx])
        detail_et = etree.HTML(detail_html)
        try:
            detail = detail_et.xpath('/html/head/meta[@name="description"]/@content')[0]
            detail = detail.replace("\n","")
            detail = detail.replace("- ","")
            detail = detail.replace(" ","")
        except Exception as e:
            print("没有详情!")
        if type(skill_list[idx]) != type(salary_list[idx]):
            skill_list[idx] = "无"
        else:
            skill_list[idx] = skill_list[idx].replace(","," ")
        if type(workspace_list[idx]) != type(salary_list[idx]):
            workspace_list[idx] = "无"
        
        print(f"{salary_list[idx]},{workspace_list[idx]},{worktime_list[idx]},{name_list[idx]},{skill_list[idx]}")
        with open("程序员客栈程序员信息.csv", mode="a", encoding="utf-8") as f:
            f.write(f"{salary_list[idx]},{workspace_list[idx]},{worktime_list[idx]},{name_list[idx]},{skill_list[idx]},{detail}\n")
    
if __name__ == "__main__":
    for i in range(1,101):		# 根据程序员客栈下面的总页数来填写
        url = f"https://www.proginn.com/cat/page/{i}/"
        html = get_html_source(url)
        get_data_from_html(html)
        
pyquery抓取猎聘网爬虫岗位信息
"""
    目标:爬猎聘网站上的爬虫岗位信息
    url: https://www.liepin.com/zhaopin/?headId=1bd035b6a73e295eaafa5aedf960fe32&ckId=23fhmys0ecze35t8oork8bqoa4zydf9a&oldCkId=1bd035b6a73e295eaafa5aedf960fe32&fkId=tonyue22m6ifnzptvbka94m9o3x1nyha&skId=tonyue22m6ifnzptvbka94m9o3x1nyha&sfrom=search_job_pc&key=%E7%88%AC%E8%99%AB&currentPage=0&scene=page
"""
from pyquery import PyQuery
import requests
import time

def get_html_source(url):
    headers = {
        # 添加一个请求头信息UA,如果没有请求头,目标服务器会拒绝我们访问,这是一个最简单的反爬手段,只需要在http请求头中添加浏览器信息,就可以骗过目标服务器。
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57"
    }
    resp = requests.get(url, headers=headers)
    resp.encoding = "utf-8"
    # with open("source.html", mode="w", encoding="utf-8") as f:
    #     f.write(resp.text)
    return resp.text

def get_data_from_html(html):
    # 加载html内容
    doc = PyQuery(html)
    doc = doc(".left-list-box > ul:nth-child(1) li").items()
    for item in doc:
        work_href = item("div.job-detail-box > a:nth-child(1)").attr("href")
        job_name = item("div.job-title-box > div:nth-child(1)").text()
        area = item("div.job-title-box > div:nth-child(2) > span:nth-child(2)").text()
        salary = item("span.job-salary").text()
        gener_skill = item("span.labels-tag").items()
        request = []
        for skill in gener_skill:
            request.append(skill.text())
        request = "|".join(request)
        company_href = item("div.job-detail-box > a:nth-child(2)").attr("href")
        company_name = item("span.company-name").text()
        area_people = []
        spans = item("div.company-tags-box > span").items()
        for span in spans:
            area_people.append(span.text())
        area_people = " ".join(area_people)
        result = f"{salary},{area},{job_name},,{request},{company_name},{area_people},{work_href},{company_href}"
        with open("猎聘爬虫岗位信息.csv", mode="a", encoding="utf-8") as f:
            f.write(f"{result}\n")
        print(result)

if __name__ == "__main__":
    print("pyquery execise")
    for i in range(10):		# 猎聘只能查10页
        url = f"https://www.liepin.com/zhaopin/?headId=1bd035b6a73e295eaafa5aedf960fe32&ckId=23fhmys0ecze35t8oork8bqoa4zydf9a&oldCkId=1bd035b6a73e295eaafa5aedf960fe32&fkId=tonyue22m6ifnzptvbka94m9o3x1nyha&skId=tonyue22m6ifnzptvbka94m9o3x1nyha&sfrom=search_job_pc&key=%E7%88%AC%E8%99%AB&currentPage={i}&scene=page"
        html = get_html_source(url)
        get_data_from_html(html)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逆向爬虫06 bs4,xpath,pyquery实战 的相关文章

随机推荐

  • 拆分单链表

    Copyright c 2016 烟台大学计算机与控制工程学院 All rights reserved 文件名 text html 作者 常轩 微信公众号 Worldhello 完成日期 2016年11月16日 版本号 V1 0 程序输入
  • vue项目接入unity3D模块并进行数据通信

    一 添加unity工程 unity工程师会提供一个前端可使用的包 将其放在vue项目的public下 我这里以unity文件夹命名 二 在项目中创建iframe标签并引入index html文件 三 修改public gt unity gt
  • YOLO V1 学习摘要

    YOLO V1是一种基于深度学习的目标检测算法 其原理和流程如下 1 利用卷积神经网络 CNN 提取输入图像的特征 2 将图像分割成S x S个网格 grid 每个网格负责检测其中一个特定尺寸和位置的目标 3 对于每个网格 预测一个包含5
  • Pycharm无法导入anaconda的包

    Pycharm无法导入anaconda的包 第一 检查是否设置了anaconda的环境变量 第二步 查看anaconda下面的envs是否为空包 如果是空包 便要创建虚拟环境详细过程可参照 2023最新 Python Pycharm Ana
  • 堆—特殊二叉树

    我们了解了树形结构之后 知道了二叉树 但是二叉树的具体用途我们还是不知道 今天就来看看一种特殊的二叉树 堆 它是一种完全二叉树 著名的topK问题就是用堆来求取的 可以求出一组数中的最大或者最小的元素 所使用的堆就是大根堆 小根堆 所谓大根
  • VMware安装Android-x86_64-9.0-r2系统兼容arm设置

    Android x86 64 9 0 r2虚拟机安装兼容arm的android应用程序 1 安装后WLAN提示已连接无网络 实际网络联通 终端模拟器依次输入以下命令后回车重启系统 su settings put global captive
  • Xray-基础详细使用

    一 Xray介绍 Xray 是一款功能强大的安全评估工具 由多名经验丰富的一线安全从业者呕心打造而成 可支持与AWVS BP等众多安全工具联合使用 二 Xray简易架构 说明 了解 Xray 的整体架构可以更好的理解客户端和配置文件的设置
  • for循环详解

    For循环详解 举例如图下 首先for循环相比其他循环可以把条件写在一起如图所示 这变量 条件 变化必不可少其他循环也是 但是for循环有一个点它在初始变量的时候 进入循环之前就已经执行了一次 条件是每次进入循环之前都会执行并且判断 还有当
  • 【git】git rebase -i 合并多次提交

    1 概述 git rebase i 命令用于交互式地重新应用提交历史 其中 i 选项表示以交互方式进行操作 通过使用这个命令 您可以合并 删除 编辑 重排等操作提交历史 从而修改提交的顺序或合并多次提交 下面是使用 git rebase i
  • Linux简介

    1 1操作系统是什么 操作系统概述 要讲明白 Linux 是什么 首先得说说什么是操作系统 计算机系统是指按用户的要求 接收和存储信息 自动进行数据处理并输出结果信息的系统 它由硬件子系统 计算机系统赖以工作的实体 包括显示屏 键盘 鼠标
  • Xcode9 xcodebuild 命令行打包遇到的坑与解决方案

    主要涉及的打包脚本命令 if xcodeversion lt 830 then Xcode 8 3 以下打包时使用该脚本 xcodebuild exportArchive exportFormat ipa archivePath schem
  • 十一、文件的读写

    一 文件的读写模式 1 文件常用的打开模式 r 只能读 r 可读可写 不会创建不存在的文件 如果直接写文件 则从顶部开始写 覆盖之前此位置的内容 如果先读后写 则会在文件最后追加内容 w 可读可写如果文件存在则覆盖整个文件 不存在则创建 w
  • 数学建模 —— 降维算法

    文章目录 前言 数据降维的作用 一 主成分分析 PCA 1 介绍 2 算法流程 3 主成分分析的说明 二 因子分析 FA 1 介绍 2 算法流程 3 因子分析和主成分分析的对比 三 典型相关性分析 CCA 1 介绍 2 算法思路 3 算法流
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方 这里简单的总结一下用位运算来实现整数的四则运算 1 整数加法 int Add int a int b for int i 1 i i lt lt 1 if b i for int j i j j lt lt
  • 网络七层及四层协议通俗详解

    1 OSI开放式网络七层协议模型 总体而言 理解记忆 我点击一个网络请求 假如使用http协议 这就是应用层 用户选择具体的协议 这个请求需要传输数据 但是不同系统因为编码等方式不同 无法识别彼此发送的消息 这个时候表示层就需要把数据整理成
  • 《剑指offer》读后感

    帮研二的学姐准备网易暑期实习的机试时 代码提交在一个OJ网站叫牛客网 出于好奇就多点了一下这个网站 看到 剑指offer 的在线编程专栏 就是把剑指offer中的题目都挂在了网上 可以在线判断是否AC 以前也总是听到学长们推荐该书 索性趁着
  • R语言实现样本量的估算(2)

    本文默认 0 05 sig level 0 2 power 根据研究需要可调整 导入包 library pwr 1 已知标准差和预期差异 1 单样本t检验 某治疗措施预期提高某物质水平8mg L 标准差为10mg L 单样本t检验 pwr
  • QVector用法详细介绍

    QVector类是动态数组的模板类 顺序容器 它将自己的每一个对象存储在连续的内存中 可以使用索引号来快速访问它们 使用前需要包含头文件 include
  • iOS(二)App第一次启动时出现的引导界面

    我们每次打开一个刚刚从AppStore下载下来的软件时 总会出来一个引导界面 有的是宣传产品 有的是介绍App的功能 最后再出来一个按钮正式进入到App 从此以后这个引导界面就再也不会出现了 除非你卸载重装 在查阅相关资料后 做了个简陋的引
  • 逆向爬虫06 bs4,xpath,pyquery实战

    逆向爬虫06 bs4 xpath pyquery实战 原本想要详细的对比一下这三个模块的使用方法 但是在实战的时候发现 只要遵循一个套路 抓取静态网页 即网页信息直接放在html源代码中 就比较容易了 一些使用细节上的问题 每个人遇到的都会