Python利用Scrapy爬取前程无忧

本文介绍了如何使用Python的Scrapy框架爬取前程无忧网站上的Python相关职位信息,包括爬虫项目的创建、item类定义、settings配置、爬取函数编写以及数据保存到csv文件的完整步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

Python利用Scrapy爬取前程无忧

**

一、爬虫准备
Python:3.x
Scrapy
PyCharm
二、爬取目标
爬取前程无忧的职位信息,此案例以Python为关键词爬取相应的职位信息,通过Scrapy来爬取相应信息,并将爬取数据保存到csv文件中。
三、爬取步骤
1.创建一个新的爬虫项目。
在这里插入图片描述
2.定义我们要爬取的内容item类

import scrapy

class QcwyItem(scrapy.Item):
    
    job_name = scrapy.Field()
    company = scrapy.Field()
    area = scrapy.Field()
    salary = scrapy.Field()
    pabulish_time = scrapy.Field()

3.配置settings.py
1)设置不遵守机器人协议

ROBOTSTXT_OBEY = False

2)设置请求头

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like
### 使用 Scrapy 处理前程无忧网的 Ajax 动态加载数据 当面对像前程无忧这样的网站,其内容通过 Ajax 动态加载时,传统的 Scrapy 可能无法直接解析这些动态生成的内容。为了应对这种情况,可以采用以下方法: #### 方法一:分析网络请求并模拟 Ajax 请求 许多动态加载的数据实际上是通过 Ajax 请求从服务器端获取的。可以通过浏览器开发者工具中的 Network 面板找到对应的 API 接口及其参数。 以下是实现此方法的具体代码示例: ```python import scrapy class WuyouSpider(scrapy.Spider): name = "wuyou" allowed_domains = ["51job.com"] def start_requests(self): ajax_url = "https://api.51job.com/api/job/search" # 替换为实际接口地址 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "Referer": "https://www.51job.com/" # 设置 Referer 防止被识别为爬虫 } params = { "keyword": "Python", # 查询关键词 "page": 1, # 当前页码 "pagesize": 20 # 每页显示数量 } yield scrapy.FormRequest( url=ajax_url, method="GET", headers=headers, formdata=params, callback=self.parse ) def parse(self, response): data = response.json() jobs = data.get("jobs", []) for job in jobs: item = {} item["title"] = job.get("job_name") # 职位名称 item["company"] = job.get("company_name") # 公司名称 item["location"] = job.get("workarea_text") # 工作地点 item["salary"] = job.get("providesalary_text") # 薪资范围 yield item ``` 这种方法的优点在于效率高、资源消耗少,但需要手动分析目标站点的 Ajax 请求逻辑[^1]。 --- #### 方法二:集成 Selenium 实现动态渲染支持 如果目标网页的动态加载机制较为复杂(例如依赖 JavaScript 渲染),可以直接将 Selenium 整合到 Scrapy 中。Selenium 提供了强大的功能用于驱动浏览器执行脚本并捕获最终渲染后的 HTML 页面。 下面是一个简单的例子展示如何配置 Scrapy 和 Selenium 的协作方式: ```python from scrapy import Spider from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium import webdriver from pydispatch import dispatcher from scrapy import signals class DynamicWuyouSpider(Spider): name = "dynamic_wuyou" custom_settings = { "DOWNLOAD_DELAY": 3, # 延迟时间防止触发反爬策略 } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) chrome_options = ChromeOptions() chrome_options.add_argument("--headless") # 启用无头模式运行Chrome self.driver = webdriver.Chrome(options=chrome_options) dispatcher.connect(self.spider_closed, signal=signals.spider_closed) def spider_closed(self, spider): """关闭蜘蛛时释放 WebDriver""" self.driver.quit() def start_requests(self): urls = [ "https://search.51job.com/list/000000,000000,0000,00,9,99,Python,2,{}.html".format(page_num) for page_num in range(1, 3) # 获取第一页至第二页的结果 ] for url in urls: yield scrapy.Request(url=url, callback=self.parse_with_selenium) def parse_with_selenium(self, response): self.driver.get(response.url) html_content = self.driver.page_source from scrapy.http import HtmlResponse new_response = HtmlResponse(url=response.url, body=html_content, encoding='utf-8') items = [] for div in new_response.css("#resultList .el")[1:]: item = {} item['title'] = div.css(".t1 a::attr(title)").get().strip() or None item['link'] = div.css(".t1 a::attr(href)").get().strip() or None item['company'] = div.css(".t2 a::text").get().strip() or None item['location'] = div.css(".t3::text").get().strip() or None item['salary'] = div.css(".t4::text").get().strip() or None items.append(item) return items ``` 该方案适用于复杂的前端交互场景,但由于涉及真实的浏览器操作,因此性能较低且占用更多计算资源[^1]。 --- #### 注意事项 无论是哪种方法都需要考虑以下几个方面: - **合法性审查**:确保遵守目标网站的服务条款以及相关法律法规。 - **IP 封禁规避措施**:合理设置下载延迟 (`DOWNLOAD_DELAY`) 或者使用代理池降低访问频率以防封 IP 地址。 - **异常处理机制**:增加重试次数和超时控制提高程序稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值