当前位置: 首页 > article >正文

Scrapy | 爬取网易招聘信息来认识start_urls是POST请求时如何重写start_requests方法以及翻页问题的处理

网易招聘爬虫

    • 目标
    • 翻页请求思路
    • 实现方法
    • 爬取网易招聘信息
      • 1. 分析网页数据
      • 2. 注意 settings.py:
      • 3. 代码实现
      • 4. 运行结果
    • 问题
      • 1. FromRequest方法对带有payload的POST无法获取数据
        • formdata 和 payload 的区别
    • 错误代码
      • 202
      • 405

目标

  1. 掌握start_urls是POST请求时,如何重写start_requests方法的问题 ⭐
  2. 掌握翻页请求的问题处理思路

地址:https://hr.163.com/job-list.html
感谢文章 : Scrapy爬虫框架案例学习之三(爬取网易招聘页面信息写入Mysql数据库)

翻页请求思路

在这里插入图片描述
回顾requests模块是如何实现翻页请求的:

1.找到下一页的URL地址
2.调用requests..get(url)

scrapy实现翻页的思路:

1.找到下一页的url地址
2.构造url地址的请求对象,传递给引擎

实现方法

1.确定ur地址
2.构造请求,scrapy.Request(url,callback)
	- callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析
3.把请求交给引擎:`yield scrapy.Request(url,,callback)`

爬取网易招聘信息

https://hr.163.com/job-list.html

  • 思路分析
    1.获取首页的数据
    2.寻找下一页的地址,进行翻页,获取数据

1. 分析网页数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 翻页判断
    在这里插入图片描述

在这里插入图片描述

2. 注意 settings.py:

1.可以在settings中设置ROBOTS协议
#False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT OBEY False
1.可以在settings中设置User-Agent:#scrapy发送的每一个请求的默认UA都是设置的这个User-Agent
USER_AGENT = 'Mozilla/5.0  xxxxx'  # 填写自己的即可

3. 代码实现

import json
from datetime import datetime

import scrapy

from wangyi.items import WangyiItem



class WangyijobSpider(scrapy.Spider):
    name = 'wangyijob'
    allowed_domains = ['hr.163.com']
    start_urls = ['https://hr.163.com/api/hr163/position/queryPage']  # 分析该网页得知是post
    next_page = 1  # 用来控制翻页的变量,主要是给URL传递参数

    def start_requests(self):
        payload = {'currentPage': '1', 'pageSize': '10'}
        # print(json.dumps(payload))
        yield scrapy.Request(
            url=self.start_urls[0],
            body=json.dumps(payload),
            method='POST',
            callback=self.parse,
            headers={'Content-Type': 'application/json','user-agent': "xxx"}
        )
    #     必须要注意的点:
    # 1、请求头一定要加上Content-.Type':'application/json
    # 2、body用json.dumps()转下

    def parse(self,response):
        # 提取数据
        dic=response.json()
        print('*'*50)
        job_list = dic['data']['list']
        print(len(job_list))

        for job in job_list:
            item = WangyiItem()
            item['name'] = job['name']
            item['address'] = str(job['workPlaceNameList']).replace('[', '').replace(']', '').replace("'",
                                                                                                                '')  # ["广州市"]
            item['productName'] = job['productName']
            item['firstPostTypeName'] = job['firstPostTypeName']
            item['recruitNum'] = job['recruitNum']
            item['reqEducationName'] = job['reqEducationName']
            item['reqWorkYearsName'] = job['reqWorkYearsName']
            item['description'] = job['description'].replace('\t', '').replace('\n', '')
            item['requirement'] = job['requirement'].replace('\t', '').replace('\n', '')
            item['updateTime'] = datetime.fromtimestamp(job['updateTime'] /1000) # 1677744796000毫秒为单位的Unix时间戳

            #处理数据
            yield item

        print('*' * 50)

        # 模拟翻页

        # 返回的数据中来判断是否为最后一页
        # true为最后一页
        page_stutas = dic['data']['lastPage']
        self.next_page = self.next_page + 1
        print('-------------------当前正在爬取第 %d 页面的职位信息----------------------'%self.next_page)

        if page_stutas == False:  # 回调出口
            payload = {
                "currentPage": "{}".format(self.next_page),
                "keyword": "Python",
                "pageSize": "10"
            }
            print(payload)
            url = self.start_urls[0]
            yield scrapy.Request(
                url=url,
                body=json.dumps(payload),
                method='POST',
                callback=self.parse,
                headers={'Content-Type': 'application/json'}
            )




4. 运行结果

在这里插入图片描述

问题

1. FromRequest方法对带有payload的POST无法获取数据

scrapy 发送payload方式的post请求,FromRequest并不支持传request payload
因此 使用如下方式是无法获得数据的:

def start_requests(self):
     payload = {'currentPage': '1', 'pageSize': '10'}
     yield scrapy.FormRequest(url=self.start_urls[0], formdata=payload, callback=self.parse)

解决办法:使用Request,添加body,并注明请求方法为post即可:

scrapy 发送payload方式的post请求

必须要注意的点: 
1、请求头一定要加上Content-Type':'application/json'
2、body用json.dumps()转一下

#  --------------------如下:-----------------------------

 yield scrapy.Request(
     url="https://hr.163.com/api/hr163/position/queryPage",
     body=json.dumps(payload),
     method='POST',  # 一定要指明
     callback=self.parse,
     headers=xxxxx  # 填写自己的请求头
 )
formdata 和 payload 的区别

在网络编程和API交互中,form-datapayload通常用于发送数据,但它们在格式和用途上有所不同:

  • FormData
  1. 用途form-data通常用于通过HTTP POST请求发送键值对形式的数据,这些数据可以是文本字段、文件或两者的组合。它模拟了表单提交的行为。
  2. 格式form-data格式的数据被编码为multipart/form-data,这意味着数据被分割成多个部分,每个部分都有自己的内容类型和边界分隔符。
  3. 编码:在form-data中,数据通常使用键值对的方式进行编码,这使得服务器可以轻松地解析出各个字段的值。
  4. 文件上传form-data非常适合上传文件,因为它允许你包含文件的二进制数据。
  5. 示例:在HTML表单中,当表单的enctype设置为multipart/form-data时,就会使用这种格式发送数据。
  • Payload
  1. 用途payload是一个通用术语,可以指任何类型的有效载荷数据,但在API交互中,它通常指的是JSON或XML格式的数据。
  2. 格式payload可以是JSON、XML或其他结构化数据格式,它通常用于API调用,以传递复杂的数据结构。
  3. 编码payload数据通常以纯文本形式发送,并且需要指定正确的Content-Type头,如application/jsonapplication/xml
  4. 数据结构payload可以包含嵌套的对象或数组,适合传递复杂的数据结构。
  5. 示例:在RESTful API调用中,你可能会发送一个JSON格式的payload来创建或更新资源。
  • 区别
  • 格式form-data通常用于发送表单数据和文件,而payload可以是JSON、XML或其他格式,用于传递结构化数据。
  • 用途form-data更适合于表单提交和文件上传,而payload更适合于API交互和数据交换。
  • 编码方式form-data使用multipart编码,而payload通常以JSON或XML格式编码。
  • 文件上传:如果你需要上传文件,form-data是更好的选择。虽然也可以在payload中发送文件的二进制数据,但这通常不是最佳实践。
  • 数据解析:服务器端解析form-datapayload的方式也不同,需要根据内容类型和编码来处理。

在实际应用中,选择form-data还是payload取决于你的具体需求,例如你是否需要上传文件,或者你是否需要发送结构化的数据。

具体应用:formdata 和 payload 的区别

错误代码

202

2024-10-16 21:13:15 [scrapy.core.engine] DEBUG: Crawled (202) <GET https://www.qidian.com/rank/hotsales?style=1&page=1> (referer: None)
2024-10-16 21:13:15 [scrapy.core.scraper] ERROR: Spider error processing <GET https://www.qidian.com/rank/hotsales?style=1&page=1> (referer: None)

Crawled (202):这表示 Scrapy 爬虫成功地从指定的 URL 获取了一个响应,并且 HTTP 状态码是 202。HTTP 状态码 202 表示“已接受”,意味着请求已被接受,但尚未完成处理。

Spider error processing:这表示在处理响应数据时,爬虫遇到了错误。这个错误可能发生在解析响应内容或执行爬虫逻辑时。

405

2024-10-16 20:59:06 [scrapy.core.engine] DEBUG: Crawled (405) <GET https://hr.163.com/api/hr163/position/queryPage&gt;  (referer: None)
2024-10-16 20:59:06 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <405 https://hr.163.com/api/hr163/position/queryPage&gt;:  HTTP status code is not handled or not allowed

Crawled (405): 这表明 Scrapy 的爬虫已经向https://hr.163.com/api/hr163/position/queryPage 发出了 GET 请求,并且收到了 HTTP 状态码 405 的响应。HTTP 状态码 405 表示“方法不允许”(Method Not Allowed),意味着您尝试使用的方法(在这个情况下是 GET)不被服务器所允许。

Ignoring response: Scrapy 的 HTTP 错误中间件(HttpError middleware)默认会忽略或跳过某些 HTTP 状态码的响应。由于 HTTP 状态码 405 不在 Scrapy 默认处理的范围内,所以该响应被忽略,并且这个事件被记录为信息(INFO)级别的日志。


http://www.kler.cn/news/354030.html

相关文章:

  • 力扣题解(鸡蛋掉落,两枚鸡蛋)
  • Bug剖析
  • 数据权限的设计与实现系列12——前端筛选器组件Everright-filter集成功能完善3
  • 优化SpringBoot接口:异步处理提升系统吞吐量策略
  • SQL语句查询
  • 【IC设计】复旦微行业分析
  • 为什么你总碰到渣男?伯克森悖论
  • 博客搭建之路:hexo使用next主题渲染流程图
  • 技术总结(七)
  • 解决ultralytics中的YOLOv8在执行task.py文件添加模块操作出现的KeyError报错
  • Linux-lvs
  • 芒果YOLOv10改进136:注意力机制MLLA|即插即用:融合Mamba设计精髓的线性注意力视觉Transformer
  • Ubuntu(Linux)tcpdump使用方法详解
  • 金融信用评分卡建模项目:AI辅助
  • mysql指令笔记(基本)
  • C#/WinForm 自定义控件绘制章鱼
  • 【2022工业3D异常检测文献】Patch+FPFH: 结合3D手工点云描述符和颜色特征的异常检测方法
  • xlsx xlsx-style-vite 实现前端根据element 表格导出excel且定制化样式 背景 列宽等
  • 【网络安全】-vulnhub靶场-noob
  • 顺序表的查找