欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Scrapy | 爬取网易招聘信息来认识start_urls是POST请求时如何重写start_requests方法以及翻页问题的处理

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

2024/10/24 1:29:36 来源:https://blog.csdn.net/HG0724/article/details/142990316  浏览:    关键词: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 datetimeimport scrapyfrom wangyi.items import WangyiItemclass WangyijobSpider(scrapy.Spider):name = 'wangyijob'allowed_domains = ['hr.163.com']start_urls = ['https://hr.163.com/api/hr163/position/queryPage']  # 分析该网页得知是postnext_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 itemprint('*' * 50)# 模拟翻页# 返回的数据中来判断是否为最后一页# true为最后一页page_stutas = dic['data']['lastPage']self.next_page = self.next_page + 1print('-------------------当前正在爬取第 %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)级别的日志。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com