前面先啰嗦一点没有用的 , 不然审核不过 , 源码在最底下
编写一个爬虫的基本实现思路可以概括为以下几个步骤。请注意,由于爬虫可能涉及法律和道德问题,特别是当它们用于未经授权地抓取网站数据时,因此在开始之前,请确保你的爬虫行为符合目标网站的robots.txt
规则以及当地的法律法规。
1. 确定目标
- 明确需求:确定你需要从哪些网站抓取哪些数据。
- 分析网站结构:了解目标网站的页面结构,包括URL模式、页面元素等。
2. 编写爬虫框架
- 选择编程语言:Python是编写爬虫的热门选择,因为它拥有强大的库支持,如
requests
、BeautifulSoup
、Scrapy
等。 - 设置基础结构:创建一个基本的Python脚本,导入必要的库。
3. 发送HTTP请求
- 使用requests库(或其他HTTP客户端库)发送GET或POST请求到目标URL。
- 处理重定向和Cookies:确保爬虫能够处理重定向和保持会话状态(如登录状态)。
- 设置请求头:模拟浏览器发送请求,设置合适的
User-Agent
和其他必要的请求头。
4. 解析HTML内容
- 使用解析库:如
BeautifulSoup
、lxml
等,解析HTML文档。 - 提取数据:根据HTML结构,使用CSS选择器、XPath等方法提取所需数据。
5. 存储数据
- 保存到文件:将抓取的数据保存为CSV、JSON等格式的文件。
- 使用数据库:对于大量数据,可以考虑使用数据库(如MySQL、MongoDB)来存储。
6. 处理JavaScript渲染的页面
- 如果目标网站大量使用JavaScript渲染页面内容,可能需要使用
Selenium
或Puppeteer
(Node.js环境)等工具来模拟浏览器行为。
7. 遵守robots.txt
规则和礼貌爬虫
- 检查robots.txt:在开始抓取之前,检查目标网站的
robots.txt
文件,确保你的爬虫行为被允许。 - 设置合理的请求间隔:避免过于频繁地发送请求,给目标网站服务器带来压力。
- 处理反爬虫机制:如验证码、IP封锁等,可能需要采取额外的措施来绕过这些机制(但请注意,绕过某些反爬虫机制可能违反法律法规)。
8. 调试和优化
- 调试:在开发过程中,使用打印语句、断点调试等方法来检查爬虫的行为是否符合预期。
- 优化性能:对于大型网站或需要抓取大量数据的情况,优化爬虫的性能变得尤为重要。可以通过多线程/多进程、异步IO等方式来提高效率。
废话不多说直接附源码
cookies需要替换成自己的 , 该网站在不登录的情况下只能请求到10页数据 , 想要获得完整数据需要携带登录后的cookies
import requests
import json
from lxml import etree
import os
import openpyxl
headers = {
}
def spiderData():
# 循环每一页
for i in range(1, 21):
# 配置账号参数
cookies = ''
# 网页链接
url = "https://api-c.liepin.com/api/com.liepin.searchfront4c.pc-search-job"
# 参数
data = {
"data": {
"mainSearchPcConditionForm": {
"city": "410",
"dq": "410",
"pubTime": "",
"currentPage": f"{i}",
"pageSize": 40,
"key": "",
"suggestTag": "",
"workYearCode": "0",
"compId": "",
"compName": "",
"compTag": "",
"industry": "H01$H01",
"salary": "",
"jobKind": 2,
"compScale": "",
"compKind": "",
"compStage": "",
"eduLevel": ""
},
"passThroughForm": {
"scene": "init",
"ckId": "0nbwaavz2gngc40f8xmfp59in6ymulua",
"skId": "pf8wezdo0ezilzl4tyd1g4tcoyh43qe9",
"fkId": "0nbwaavz2gngc40f8xmfp59in6ymulua",
"suggest": None
}
}
}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, data=data).json()
print(f"正在爬取第{i + 1}页")
praseData(response)
# 这段代码主要用于解析和保存来自招聘网站的职位信息。下面是加上注释后的代码:
def praseData(data):
for z in range(0,40):
job_card_list = data.get('data', {}).get('data', {}).get('jobCardList', [])
if 0 <= z < len(job_card_list):
res_json_item = job_card_list[z]
# 公司名称
comp_name = res_json_item.get('comp', {}).get('compName')
# 职位链接
job_link = res_json_item.get('job', {}).get('link')
# 工作地点
place = res_json_item.get('job', {}).get('dq')
# 薪资
salary = res_json_item.get('job', {}).get('salary')
# 职位名称
job = res_json_item.get('job', {}).get('title')
else:
# 如果z不是有效索引或job_card_list为空,则处理错误或设置默认值
comp_name = None
job_link = None
place = None
salary = None
job = None
# 解析职位详情页面
sub_data = requests.get(job_link, headers=headers).text
# 使用 etree 解析 HTML 数据
xml = etree.HTML(sub_data)
# 尝试从详情页面中提取公司简介
try:
details = xml.xpath('//dl[@class="paragraph"]/dd/text()')[0]
except:
details = None
# 公司简介
companyProfile = xml.xpath("//div[@class='paragraph-box']/div/text()")
company_profile = ','.join(companyProfile)
# 公司信息
try:
intorduct = details.split('截止日期')[0].split()
intorducts = ','.join(intorduct)
except:
intorducts = None
# 保存到 excle 表格
job_list = [job,place,salary,comp_name,company_profile,intorducts]
print(job_list)
save_data_to_xlsx(job_list)
# 保存到excle表格
def save_data_to_xlsx(data ):
filename = f'job.xlsx'
name_headers = ['职位', '地点', '薪资', '公司名称', '公司简介','描述']
if os.path.exists(filename):
workbook = openpyxl.load_workbook(filename)
sheet = workbook.active
sheet.append(data)
else:
workbook = openpyxl.Workbook()
sheet = workbook.active
# 添加表头
sheet.append(name_headers)
sheet.append(data)
# 保存 Excel 文件
workbook.save(filename)
if __name__ == '__main__':
spiderData()