爬虫总结

爬取网站的思路

  1. 先确定是否为动态加载网站
  2. 找URL规律
  3. 正则表达式或xpath
  4. 定义程序框架,补全并测试代码

多级页面数据抓取

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地址

scrapy框架爬虫

selenium+browser爬虫

解析模块总结

正则解析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浏览器安装插件

在线安装

  1. 下载插件 - google访问助手
  2. 安装插件 - google访问助手: Chrome浏览器-设置-更多工具-扩展程序-开发者模式-拖拽(解压后的插件)
  3. 在线安装其他插件 - 打开google访问助手 - google应用商店 - 搜索插件 - 添加即可

离线安装

  1. 下载插件 - xxx.crx 重命名为 xxx.zip,解压不解压都可以,我没解压
  2. 打开Chrome浏览器 -> 右上角设置 -> 更多工具 -> 扩展程序 -> 点开开发者模式
  3. 把相关插件文件夹 拖拽 到浏览器中,释放鼠标即可安装
  4. 重启浏览器,使插件生效

爬虫常用插件插件

  1. google-access-helper : 谷歌访问助手,可访问 谷歌应用商店
  2. Xpath Helper: 轻松获取HTML元素的xPath路径,开启/关闭: Ctrl + Shift + x
  3. Proxy SwitchyOmega: Chrome浏览器中的代理管理扩展程序
  4. JsonView: 格式化输出json格式数据

 

posted @ 2019-09-11 08:45  凌逆战  阅读(925)  评论(1编辑  收藏  举报