scrapy爬取拉钩网
时间: 2023-11-13 08:45:33 浏览: 96
使用scrapy框架爬取拉勾网数据
好的,下面是 scrapy 爬取拉钩网的步骤:
1. 创建 scrapy 项目
在命令行中输入以下命令来创建 Scrapy 项目:
```
scrapy startproject lagou
```
其中,`lagou` 是项目名称。
2. 创建爬虫
在项目的根目录下,使用以下命令创建一个爬虫:
```
scrapy genspider lagou_spider www.lagou.com
```
其中,`lagou_spider` 是爬虫名称,`www.lagou.com` 是要爬取的网站的域名。
3. 编写爬虫代码
打开 `lagou_spider.py` 文件,将其修改为以下内容:
```python
import scrapy
class LagouSpider(scrapy.Spider):
name = "lagou"
allowed_domains = ["www.lagou.com"]
start_urls = ["https://www.lagou.com/"]
def parse(self, response):
pass
```
我们定义了一个 `LagouSpider` 类,并指定了名称、域名和起始 URL。在 `parse` 方法中,我们暂时没有写任何代码,因为我们需要先分析网站的页面结构和数据格式,才能编写爬虫代码。
4. 分析页面结构和数据格式
使用浏览器打开拉钩网站,进入搜索职位界面,选择一个职位类型,例如 Python 开发,然后按下搜索按钮。此时,浏览器会跳转到一个新的页面,该页面的 URL 会包含搜索的关键词。例如,搜索 Python 开发,URL 为 `https://www.lagou.com/zhaopin/Python/`。
我们打开浏览器的开发者工具,切换到 Network 选项卡,然后点击搜索按钮。此时,我们会看到浏览器发送了多个请求,其中一个是 `https://www.lagou.com/jobs/positionAjax.json`,该请求返回了搜索结果的 JSON 数据。我们可以点击该请求,然后在 Preview 选项卡中查看数据格式。
我们可以看到,返回的 JSON 数据包含了多个职位的信息,每个职位包含了如下字段:
- `companyFullName` 公司全名
- `companyShortName` 公司简称
- `companySize` 公司规模
- `district` 工作地点
- `education` 学历要求
- `financeStage` 融资阶段
- `firstType` 职位类别
- `industryField` 行业领域
- `positionAdvantage` 职位诱惑
- `positionId` 职位ID
- `positionName` 职位名称
- `salary` 薪资范围
- `secondType` 职位子类别
- `workYear` 工作经验
现在,我们已经了解了数据的格式,可以开始编写爬虫代码了。
5. 完善爬虫代码
我们需要在 `parse` 方法中,向 `https://www.lagou.com/jobs/positionAjax.json` 发送请求,获取 JSON 数据,并解析数据,提取职位信息。
以下是完整的爬虫代码:
```python
import scrapy
import json
class LagouSpider(scrapy.Spider):
name = "lagou"
allowed_domains = ["www.lagou.com"]
start_urls = ["https://www.lagou.com/"]
def parse(self, response):
job_types = ["Python", "Java", "PHP", "C++", "C#", "Ruby", "Scala", "Go", "Swift"]
for job_type in job_types:
url = "https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false&isSchoolJob=0"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.2236.0 Safari/537.36 Edg/114.0.2236.0",
"Referer": f"https://www.lagou.com/zhaopin/{job_type}/"
}
data = {
"first": "false",
"pn": "1",
"kd": job_type
}
yield scrapy.Request(url=url, method="POST", headers=headers, body=json.dumps(data), callback=self.parse_job_list, meta={"job_type": job_type})
def parse_job_list(self, response):
job_type = response.meta["job_type"]
result = json.loads(response.text)
for job in result["content"]["positionResult"]["result"]:
yield {
"job_type": job_type,
"position_name": job["positionName"],
"salary": job["salary"],
"company_full_name": job["companyFullName"],
"work_year": job["workYear"],
"education": job["education"],
"job_nature": job["jobNature"],
"position_advantage": job["positionAdvantage"]
}
```
在 `parse` 方法中,我们通过循环遍历多个职位类型,向 `https://www.lagou.com/jobs/positionAjax.json` 发送 POST 请求,获取 JSON 数据。我们在请求头中设置了 User-Agent 和 Referer,以便绕过反爬虫机制。我们在请求体中设置了查询参数,其中 `kd` 表示搜索的职位类型。我们使用 `json.dumps` 方法将请求体转换为 JSON 格式,并将结果作为请求体发送。
在 `parse_job_list` 方法中,我们解析了返回的 JSON 数据,并提取了职位信息。我们使用 `yield` 关键字将每个职位信息生成为一个字典,然后交给 Scrapy 引擎处理。
6. 运行爬虫
在命令行中进入项目的根目录,然后输入以下命令,运行爬虫:
```
scrapy crawl lagou -o lagou.json
```
其中,`-o lagou.json` 表示将爬取的数据保存到 `lagou.json` 文件中。您可以根据需要修改文件名和路径。
7. 结果分析
打开生成的 `lagou.json` 文件,您可以看到爬取到的数据。每个职位信息都包含了职位类型、职位名称、薪资范围、公司全名、工作经验、学历要求、职位性质和职位诱惑等字段。您可以根据需要对数据进行分析和处理。
阅读全文