验证码、Cookie、IP等处理方式

验证码

1. 模拟登录的意义
- 爬取基于某些用户的用户信息, 获取cookie

2. 云打码平台实现流程

1) 对携带验证码的页面数据进行抓取
2) 可以将页面数据中验证码进行解析,验证码图片下载到本地
3) 以将验证码图片提交给三方平台进行识别,返回验证码图片上的数据值
4) 基于登录按钮发起post请求(处理参数)

- 云打码平台:
     - 1) 在官网中进行注册(普通用户和开发者用户)
     - 2) 登录开发者用户:
         - 1) 实例代码的下载(开发文档-> 调用实例及最新的DLL-> PythonHTTP实例下载)
         - 2) 创建一个软件: 我的软件-> 添加新的软件
     - 3) 使用示例代码中的源码文件中的代码进行修改,让其识别验证码图片中的数据值

代理 IP

1. 什么是代理?
代理就是第三方代替本体处理相关事务。

2. 为什么需要使用代理
一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。
1. 代理服务器
- 快代理
- 西祠代理
- http://www.goubanjia.com/

2. 匿名度
- 透明: 对方服务器知道你使用了代理ip, 也知道你的真实ip
- 匿名: 知道你使用了代理ip, 不知道你的真实ip
- 高匿: 两者都不知道

3. 类型
- http: 只可以发送http请求
- https: 只可以发送https请求

cookie的应用和处理

1. cookie 概念
	当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。

2. 处理 cookie 的方式
	- 1) 手动处理: 在headers 中添加 cookie 键值对
	- 2) 自动处理: 会话对象Session, 该对象可以像requests模块一样进行网络请求的发送(get, post), session进行的请求发送可以自动携带和处理cookie.(自动保存cookie)

图片懒加载

懒加载概念:
	图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。
	
网站一般如何实现图片懒加载技术呢?
	在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。

实例

人人网进行登陆校验

import requests
from lxml import etree
from urllib import request
from CodeClass import YDMHttp

def get_code_text(file_path, code_type):
    username = 'yanzhi'
    password = 'abcd1234'
    appid = 7597
    appkey = 'a0e4bfd76d74cbf4dc5758fc4e760f08'
    filename = file_path
    codetype = code_type
    timeout = 30

    if (username == 'username'):
        print('请设置好相关参数再测试')
    else:
        # 初始化
        yundama = YDMHttp(username, password, appid, appkey)

        uid = yundama.login()
        print('uid: %s' % uid)

        balance = yundama.balance()
        print('balance: %s' % balance)

        cid, result = yundama.decode(filename, codetype, timeout)
        print('cid: %s, result: %s' % (cid, result))
        return result


url = 'http://www.renren.com/'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
}

page_text = requests.get(url=url, headers=headers).text
# 解析出验证码图片地址
tree = etree.HTML(page_text)
code_img_url = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
request.urlretrieve(url=code_img_url, filename='./code.jpg')

# 使用打码平台, 识别验证码
code_text = get_code_text('./code.jpg', 2004)

# 模拟登录
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019401948420'
data = {
    "email": "18247804718",
    "icode": code_text,
    "origURL": "http://www.renren.com/home",
    "password": "4205897ac7aa5e9bc57eba70775e02b34796",
    "rkey": "ad1eb852f18356e260bb63c33c67ca5a",
    "f": "http%3A%2F%2Fwww.renren.com%2F970680347",
}
response = requests.post(url=login_url, headers=headers, data=data)
print(response.status_code)
page_texts = response.text
print(page_texts)

利用不同的代理ip进行访问

import requests
import random

header_list = [
    # 火狐
    {
    "user-agent": "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"},
    # 谷歌
    {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"}
]
# 不同的代理IP
proxy_list = [
    {"http": "112.115.57.20:3128"},
    {'http': '121.41.171.223:3128'}
]
# 随机获取UA和代理IP
header = random.choice(header_list)
proxy = random.choice(proxy_list)

url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
# 参数3:设置代理
response = requests.get(url=url,headers=header,proxies=proxy)

with open('daili.html', 'wb') as fp:
     fp.write(response.content)
# 切换成原来的IP
requests.get(url, proxies={"http": ""})

基于cookie的案例分析: 爬取www.xueqiu.com

import requests
import json

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
}
url = 'https://xueqiu.com/'

# 自动获取cookie, cookie会自动存储到session中
session = requests.Session()

c_url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=-1&count=10&category=-1'

# 携带cookie进行请求发送
dic_json = session.get(url=c_url, headers=headers).json()
for dic in dic_json['list']:
    data = json.loads(dic["data"])
    detail_url = "https://xueqiu.com" + data["target"]
    print(detail_url)
posted @ 2019-06-27 10:09  言值  阅读(1290)  评论(1编辑  收藏  举报