爬虫总结
爬取网站的思路
- 先确定是否为动态加载网站
- 找URL规律
- 正则表达式或xpath
- 定义程序框架,补全并测试代码
多级页面数据抓取
1、爬取一级页面,提取所需数据+链接,继续跟进
2、爬取二级页面,提取所需数据+链接,继续跟进
3、...
爬虫代码规范书写:
# 程序结构 class xxxSpider(object): def __init__(self): # 定义常用变量,url,headers及计数等 def get_html(self): # 获取响应内容函数,使用随机User-Agent def parse_html(self): # 使用正则表达式来解析页面,提取数据 def write_html(self): # 将提取的数据按要求保存,csv、MySQL数据库等 def main(self): # 主函数,用来控制整体逻辑 if __name__ == '__main__': # 程序开始运行时间戳 start = time.time() spider = xxxSpider() spider.main() # 程序运行结束时间戳 end = time.time() print('执行时间:%.2f' % (end-start))
常见的反爬总结
基于User-Agent反爬
一般被关注的变量是userAgent和Referer和Cookie,可以考虑用浏览器中
1、发送请求携带请求头: headers={'User-Agent' : 'Mozilla/5.0 xxxxxx'}
User-Agent限制:网站可能会判断当某一个User-Agent高频率访问的时候,会加以限制。
解决方法:
1、定义列表存放大量User-Agent,使用random.choice()每次随机选择
2、定义py文件存放大量User-Agent,使用random.choice()每次随机选择
3、使用fake_useragent每次访问随机生成User-Agent
from fake_useragent import UserAgent ua = UserAgent() user_agent = ua.random print(user_agent)
IP限制:网站根据IP地址访问频率进行反爬,短时间内进制IP访问
解决方案:
1、构造自己IP代理池,每次访问随机选择代理,经常更新代理池
2、购买开放代理或私密代理IP
3、降低爬取的速度
Cookies:建立有效的Cookie池,每次访问随机切换
1、适用网站类型: 爬取网站页面时需要登录后才能访问,否则获取不到页面的实际响应数据
2、方法1(利用cookie)
1、先登录成功1次,获取到携带登陆信息的Cookie(处理headers)
2、利用处理的headers向URL地址发请求
3、方法2(利用session会话保持)
1、实例化session对象
session = requests.session()
2、先post : session.post(post_url,data=post_data,headers=headers)
1、登陆,找到POST地址: form -> action对应地址
2、定义字典,创建session实例发送请求
# 字典key :<input>标签中name的值(email,password)
# post_data = {'email':'','password':''}
3、再get : session.get(url,headers=headers)
验证码:验证码数量较少可人工填写,图形验证码可使用tesseract识别,其他情况只能在线打码、人工打码和训练机器学习模型
响应内容前端JS做处理反爬
1、html页面中可匹配出内容,程序中匹配结果为空
- 响应内容中嵌入js,对页面结构做了一定调整导致,通过打印查看网页源代码,格式化输出查看结构,更改xpath或者正则测试
2、如果数据出不来可考虑更换 IE 的User-Agent尝试,数据返回最标准
From表达数据认证(salt、sign)签名及js加密:一般为本地JS加密,查找本地JS文件,分析,或者使用execjs模块执行JS
js调整页面结构
js在响应中指定新地址:从响应代码中找目标地址,政府行政编码
动态生成
动态加载的数据,数据不再网页代码中,而是在后台的异步加载的数据包中。
1、F12打开控制台,页面动作抓取网络数据包
2、抓取json文件URL地址
# 控制台中 XHR :异步加载的数据包
# XHR -> Query String(查询参数)
请求模块总结
urllib库使用流程
# 编码 params = { '':'', '':'' } params = urllib.parse.urlencode(params) url = baseurl + params # 请求 request = urllib.request.Request(url,headers=headers) response = urllib.request.urlopen(request) html = response.read().decode('utf-8')
requests模块使用流程
baseurl = 'http://tieba.baidu.com/f?' html = requests.get(baseurl,params=params,headers=headers).content.decode('utf-8','ignore')
写程序最终目的:程序不要因为任何异常而终止,页面请求设置超时时间,并用try捕捉异常,超过指定次数更换下一个url地址
解析模块总结
正则解析re模块
import re pattern = re.compile('正则表达式',re.S) r_list = pattern.findall(html)
lxml解析库
from lxml import etree parse_html = etree.HTML(res.text) r_list = parse_html.xpath('xpath表达式')
json
# json # 响应内容由json转为python html = json.loads(res.text) # 所抓数据保存到json文件 with open('xxx.json','a') as f: json.dump(item_list,f,ensure_ascii=False) # 或 f = open('xxx.json','a') json.dump(item_list,f,ensure_ascii=False) f.close()
Chrome浏览器安装插件
在线安装
- 下载插件 - google访问助手
- 安装插件 - google访问助手: Chrome浏览器-设置-更多工具-扩展程序-开发者模式-拖拽(解压后的插件)
- 在线安装其他插件 - 打开google访问助手 - google应用商店 - 搜索插件 - 添加即可
离线安装
- 下载插件 - xxx.crx 重命名为 xxx.zip,解压不解压都可以,我没解压
- 打开Chrome浏览器 -> 右上角设置 -> 更多工具 -> 扩展程序 -> 点开开发者模式
- 把相关插件文件夹 拖拽 到浏览器中,释放鼠标即可安装
- 重启浏览器,使插件生效
爬虫常用插件插件
- google-access-helper : 谷歌访问助手,可访问 谷歌应用商店
- Xpath Helper: 轻松获取HTML元素的xPath路径,开启/关闭: Ctrl + Shift + x
- Proxy SwitchyOmega: Chrome浏览器中的代理管理扩展程序
- JsonView: 格式化输出json格式数据