12_爬虫阶段性总结

简述

本节将针对以往 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、数据加载方式
分析目标数据以何种形式加载,以便确定抓取后解析方式JsonBeautifulSoup,是否需要递归翻页等
3、代码实现
通过request模块,实现数据抓取,期间可能涉及cookiesheaders、密钥模拟等问题,不断解决完善即可;选择合适模块解析数据;实现入库存储

问题总结

问题一、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获取
问题三、返回数据解析异常

因无法确定所有内容格式完全一致,需使用各种方式捕获解析异常,例如typelen、三元比较符

# 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 ''
问题四、因数据量大,检查是否已重复数据耗时

实际抓取过程中,检查是否重复操作响应时间随数据量增长而增加,建议设计表时就建立合适索引

问题五、程序其他原因崩溃

实际抓取过程中程序可能因重重原因崩溃,建议不断记录异常,不断添加异常处理,处理结束后,休息片刻,自动调用合适程序段继续抓取

其他

抓取中涉及模拟cookiesheaderstimeout等,本质上最理想的抓取程序都是尽力模拟真实请求,而与之对立,作为数据提供方 / 发布方也会有对应反爬措施。
为了世界和平,作为抓取方,尽量通过正规API获取数据,必须模拟抓取时,请设置适当请求间隔时间;作为数据方,编写完整的API,秘密数据不放互联网。
最后说明,尊重数据提供方发布的爬虫协议,该协议为根目录下·robots.txt·文件

示例,知乎爬虫协议:https://www.zhihu.com/robots.txt
    原文作者:过桥0811
    原文地址: https://www.jianshu.com/p/7d832c3ad7cf
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞