本次内容:
Python采集某网站数据内容, 并把详情信息保存PDF
本次使用开发环境:
- Python 3.8
- Pycharm 2021.2专业版
- 保存PDF 需要 wkhtmltopdf 安装包
模块使用:
需安装模块
- requests 数据请求模块
安装方法:pip install requests - parsel 数据解析模块 pip install parsel
- pdfkit PDF模块 pip install pdfkit
内置模块(不许安装)
- re 正则表达式 内置模块
- json 字符串转Json数据 内置模块
- csv 保存csv模块 内置模块
- time 时间模块 内置模块
如何安装模块
- win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
- 在pycharm中点击Terminal(终端) 输入安装命令
本节课的案例思路(爬虫最基本思路流程):
一. 数据来源分析
- 确定我们想要数据内容是什么? 音乐
- 通过开发者工具进行抓包分析, 分析数据来源 >>> 音乐播放地址是从哪里的
二. 代码实现步骤 爬虫四部曲: 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据
- 发送请求, 对于什么url发送什么请求, 携带headers伪装
网址
发送请求get请求 - 获取数据, 获取服务器返回响应数据
- 解析数据, 提取我们想要数据内容 职位相关信息数据
- 保存数据, 保存文本/数据库/表格.... csv表格数据
- 多页数据采集
代码展示
首先导入模块
import requests
import parsel # 数据解析模块 pip install parsel
import pdfkit # pip install pdfkit
# 导入正则表达式模块
import re # 内置模块
# 导入json
import json # 内置模块
# 导入格式化输出模块
import pprint # 内置模块
# 导入csv模块
import csv # 内置模块
# 导入时间模块
import time
1. 发送请求
def get_job_content(title, html_url):
# url = 'https://jobs.51job.com/shenzhen-lgq/138509815.html' # 招聘详情页
html_str = """
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
{article}
</body>
</html>
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
}
response = requests.get(url=html_url, headers=headers, proxies=[])
response.encoding = 'gbk'
2. 获取数据
# print(response.text)
3. 解析数据 css选择器 根据标签属性提取数据内容
selectors = parsel.Selector(response.text) # 把获取到html字符串数据转成selector对象
content = selectors.css('body > div.tCompanyPage > div.tCompany_center.clearfix > div.tCompany_main').get()
print(content)
html_data = html_str.format(article=content)
# '1.html' 公司名字 + 职位名字 命名
html_path = 'html\\' + title + '.html'
pdf_path = 'pdf\\' + title + '.pdf'
with open(html_path, mode='w', encoding='utf-8') as f:
f.write(html_data)
config = pdfkit.configuration(wkhtmltopdf=r'C:\01-Software-installation\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_file(html_path, pdf_path, configuration=config)
# mode模式保存方式/读取方式 a追加写入 不会覆盖 w 写入 会覆盖
f = open('招聘_1.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'标题',
'公司名字',
'薪资',
'城市',
'学历',
'经验',
'公司类型',
'公司属性',
'公司规模',
'福利待遇',
'发布日期',
'详情页',
])
csv_writer.writeheader() # 写入表头
for page in range(1, 11):
1. 发送请求 f'{page}' 字符串格式化方法 format()
print(f'===============================正在采集第{page}页的数据内容===============================')
time.sleep(2)
url = f'https://search.51job.com/list/010000%252c020000%252c030200%252c040000,000000,0000,00,9,99,python,2,{page}.html'
# headers 字典数据类型 键值对形式
# 快速批量替换, 选择需要替换内容 ctrl + R 输入 正则语法
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
}
# 通过request模块里面get方法对于 url地址发送请求, 并且携带上headers请求头, 最后用response自定义变量接收返回数据内容
response = requests.get(url=url, headers=headers)
2. 获取数据, 获取服务器返回响应数据
# print(response.text)
3. 解析数据
# 从response.text里面去找寻window.__SEARCH_RESULT__ = (.*?)</script> 从window.__SEARCH_RESULT__ =开始 </script>这里结束中间的
html_data = re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', response.text)[0] # findall() 从哪里找什么数据
# print(html_data)
# type() 可以查看数据类型
# print(type(html_data))
# 如果它是一个字典的话, 对于取值的是会非常方便, 字符串转字典数据
json_data = json.loads(html_data) # 转成字典数据类型
# 字典取值 通过键值对取值, 通过冒号左边[键]的内容, 提取冒号右边[值]的内容
# pprint.pprint(json_data['engine_jds']) 格式化输出 让字典数据 有一个展开的输出效果 print()打印是在一行
# lis = [1,2,3,4,5,6,7,9] for i in lis: (for循环遍历) 把列表里面元素一个一个提取出来
for index in json_data['engine_jds']:
dit = {
'标题': index['job_name'],
'公司名字': index['company_name'],
'薪资': index['providesalary_text'],
'城市': index['workarea_text'],
'学历': index['attribute_text'][2],
'经验': index['attribute_text'][1],
'公司类型': index['companytype_text'],
'公司属性': index['companyind_text'],
'公司规模': index['companysize_text'],
'福利待遇': index['jobwelf'],
'发布日期': index['updatedate'],
'详情页': index['job_href'],
}
title = index['job_name'] + index['company_name']
title = re.sub(r'[/\:?*"<>|]', '', title)
get_job_content(title, index['job_href'])
csv_writer.writerow(dit)
print(dit)
一些小知识点
无论是 css xpath 还是 re 正则表达式 提取数据返回是[]空列表
- 语法不对
- 服务器时候返回数据(是否被反爬)
- 是否找对数据来源
xpath-help (匹配是元素面板)
爬虫是看服务器返回数据
python应用领域
- 爬虫程序
- 数据分析 >>> 数据分析 powerbi
- 网站开发 >>> 开发一个网站
- 游戏开发 >>> pygame
- 游戏辅助 >>> 模拟点击 图像识别 模拟点击
- 人工智能 >>> 目前算法 都是调用别人写好API接口
- 图像处理 >>> 根据照片定位 手机拍照打开定位了 然后发给别人了, 可以通过这张照片定位
- 自动化脚本
- 自动化测试 / 运维
- GUI桌面应用开发 开发软件 tk pyqt