简述
本节将针对以往 Python
爬虫示例中遇到的问题进行分享
常用插件说明
# 当前使用 Python 版本为 3.5
import requests #核心请求模块
from bs4 import BeautifulSoup #抓取内容解析
import re #正则表达式
import time, os #时间、操作系统接口
import datetime #日期时间
import pymssql #MS SQL Server数据库
import pymongo #MongoDB数据库
import json #Json解析
import crypto #解密加密
import execjs #运行JavaScript
思路分析
1、明确目标
分析目标能提供哪些数据,自己需要哪些数据,使用Excel
构建出目标数据结构
2、数据加载方式
分析目标数据以何种形式加载,以便确定抓取后解析方式Json
或BeautifulSoup
,是否需要递归翻页等
3、代码实现
通过request
模块,实现数据抓取,期间可能涉及cookies
、headers
、密钥模拟等问题,不断解决完善即可;选择合适模块解析数据;实现入库存储
问题总结
问题一、crypto
使用、部署,提示Json
未定义、缺少标识符、字符串或数字
出现以上问题可能为被调用JavaScript
中有未被运行环境兼容的语法,建议先查看运行环境版本,若比较早期版本则直接安装node.js
#查看运行环境版本命令
>>> execjs.get().name
'Node.js (V8)'
问题二、requests
请求后返回类型不一
需要针对返回不同数据,选择合适解析方式
#常用
r = requests.get(url)
r.content #字节
r.text #字符串
r.json() #Json格式
#其他
r.status_code #响应状态码
r.headers #响应头
r.cookies.get_dict() #cookies获取
问题三、返回数据解析异常
因无法确定所有内容格式完全一致,需使用各种方式捕获解析异常,例如type
、len
、三元比较符
# type
if type(dist_aqi) == dict: #其他无法解析类型
print(dist_aqi["error"])
else:
parse_html_aqi(dist_aqi)
# 三元比较符
aqi = city_air_quality["aqi"] if 'aqi' in city_air_quality else ''
问题四、因数据量大,检查是否已重复数据耗时
实际抓取过程中,检查是否重复操作响应时间随数据量增长而增加,建议设计表时就建立合适索引
问题五、程序其他原因崩溃
实际抓取过程中程序可能因重重原因崩溃,建议不断记录异常,不断添加异常处理,处理结束后,休息片刻,自动调用合适程序段继续抓取
其他
抓取中涉及模拟cookies
、headers
、timeout
等,本质上最理想的抓取程序都是尽力模拟真实请求,而与之对立,作为数据提供方 / 发布方也会有对应反爬措施。
为了世界和平,作为抓取方,尽量通过正规API
获取数据,必须模拟抓取时,请设置适当请求间隔时间;作为数据方,编写完整的API
,秘密数据不放互联网。
最后说明,尊重数据提供方发布的爬虫协议,该协议为根目录下·robots.txt·文件
示例,知乎爬虫协议:https://www.zhihu.com/robots.txt