爬虫 Connection 代理 cookie 验证码

爬取网页遇到问题:
http://sc.chinaz.com/jianli/free.html爬取简历模板
HTTPConnectionPool(host:XX)Max retries exceeded with url。

原因:
1当你在短时间内发起高频请求时,http 的连接池中的连接资源被耗尽
     Connection:keep-alive
2 IP 被封

解决方法:
1 请求headers 中添加:
        Connection:‘close‘

2换ip

数据解析
    目的:实现聚焦爬虫!!!
数据解析的通用原理:
    1.标签定位
    2.数据提取
bs4:
    1.实例化一个BeautifulSoup的对象,将即将被解析的页面源码加载到该对象
    2.属性和方法实现标签定位和数据的提取

    soup.tagName
    soup.find/findall(‘tagName‘,class=‘value‘)
    select(‘选择器‘):返回的是列表
    tag.text/string:字符串
    tag[‘attrName‘]

xpath:xpath方法返回的一定是列表

    表达式最左侧的/ 和 //的区别
    非最左侧的/和//的区别
    属性定位://div[@class="xxx"]
    索引定位://div[2]
    /text() //text()
    /div/a/@href

代理

代理操作
目的:为解决ip被封的情况

什么是代理?
代理服务器:fiddler

为什么使用了代理就可以更改请求对应的ip呢?
本机的请求会先发送给代理服务器,代理服务器会接受本机发送过来的请求(当前请求对应的ip就是本机ip),
然后代理服务器会将该请求进行转发,转发之后的请求对应的ip就是代理服务器的ip。

提供免费代理ip的平台
    www.goubanjia.com
    快代理
    西祠代理
    代理精灵:http://http.zhiliandaili.cn

代理ip的匿名度
透明:使用了透明的代理ip,则对方服务器知道你当前发起的请求使用了代理服务器并且可以监测到你真实的ip
匿名:知道你使用了代理服务器不知道你的真实ip
高匿:不知道你使用了代理服务器也不知道你的真实ip

代理ip的类型
http:该类型的代理IP只可以转发http协议的请求
https:只可以转发https协议的请求
# 代理
import requests
import random
from lxml import etree
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

# 搭建一个简易的代理池
proxy_list=[

    {‘https‘:‘118.26.170.209:8080‘},
    {‘https‘:‘212.64.51.13:8888‘},

]

url=‘https://www.baidu.com/s?wd=ip‘

# 基础方法
# page_text=requests.get(url=url,headers=headers,proxies={‘https‘:‘118.26.170.209:8080‘}).text

page_text=requests.get(url=url,headers=headers,proxies=random.choice(proxy_list)).text

# 查看代理
with open(‘ip.html‘,‘w‘,encoding=‘utf-8‘) as fp:
    fp.write(page_text)
# 代理精灵 http.zhiliandaili.cn

# 代理
import requests
import random
from lxml import etree
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

p_ips=[]

ip_url=‘http://ip.11jsq.com/index.php/api/entry?method=proxyServer.generate_api_url&packid=1&fa=0&fetch_key=&groupid=0&qty=3&time=1&pro=&city=&port=1&format=html&ss=5&css=&dt=1&specialTxt=3&specialJson=‘
page_text=requests.get(url=ip_url,headers=headers).text
tree=etree.HTML(page_text)
ip_list=tree.xpath(‘//body//text()‘)

for ip_port in ip_list:
    dic={"https":ip_port}
    p_ips.append(dic)

print(p_ips)

all_ips=[]

url=‘https://www.kuaidaili.com/free/inha/%d/‘

for page in range(1,3):
    print("爬取第{}页数据".format(page))
    new_url=format(url%page)
    iipp = random.choice(p_ips)
    print(iipp)
    page_text=requests.get(url=new_url,headers=headers,verify=False,proxies=iipp).text

    tree=etree.HTML(page_text)
    tr_list=tree.xpath("//div[@id=‘list‘]/table//tr")[1:]

    for tr in tr_list:
        ip=tr.xpath("./td[1]/text()")[0]
        port=tr.xpath("./td[2]/text()")[0]
        type=tr.xpath("./td[4]/text()")[0]
        dic={
            "ip":ip,
            "port":port,
            "type":type,
        }
        all_ips.append(dic)

print(all_ips)

print(len(all_ips))

cookie

# Cookie
# 什么是cookie?
#     保存在客户端的键值对
# 爬取雪球网中的新闻数据:https://xueqiu.com/

# import requests
# import random
# from lxml import etree
# headers={
#     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
# }    

# # 通过抓包工具捕获基于Ajax 请求的数据包中的url
# url=‘https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20343440&count=15&category=-1‘

# data=requests.get(url=url,headers=headers).text
# print(data)

# # 报错信息
# # {"error_description":"遇到错误,请刷新页面或者重新登录帐号后再试",
# # "error_uri":"/v4/statuses/public_timeline_by_category.json","error_data":null,"error_code":"400016"}

import requests
import random
from lxml import etree
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}    

# 创建一个Session的对象
session=requests.Session()

first_url=‘https://xueqiu.com/‘

# 获取cookie 并将其保存到 session中
session.get(url=first_url,headers=headers)

# 通过抓包工具捕获基于Ajax 请求的数据包中的url
url=‘https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20343440&count=15&category=-1‘

携带cookie 发送请求
data=session.get(url=url,headers=headers).json()
print(data)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

验证码

# - 验证码的识别
#     - 超级鹰:http://www.chaojiying.com/about.html
#         - 使用流程:
#             - 注册:用户中心身份的账号
#             - 登陆:
#                 - 充值一块
#                 - 创建一个软件:软件ID-》生成一个软件ID
#                 - 下载示例代码:下载基于python的示例代码
#     - 云打码:http://www.yundama.com/demo.html

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

实例展示

#!/usr/bin/env python
# coding:utf-8

# 这是直接调用超级鹰 的开发文档
import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode(‘utf8‘)
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            ‘user‘: self.username,
            ‘pass2‘: self.password,
            ‘softid‘: self.soft_id,
        }
        self.headers = {
            ‘Connection‘: ‘Keep-Alive‘,
            ‘User-Agent‘: ‘Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)‘,
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            ‘codetype‘: codetype,
        }
        params.update(self.base_params)
        files = {‘userfile‘: (‘ccc.jpg‘, im)}
        r = requests.post(‘http://upload.chaojiying.net/Upload/Processing.php‘, data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            ‘id‘: im_id,
        }
        params.update(self.base_params)
        r = requests.post(‘http://upload.chaojiying.net/Upload/ReportError.php‘, data=params, headers=self.headers)
        return r.json()
# if __name__ == ‘__main__‘:
#     chaojiying = Chaojiying_Client(‘超级鹰用户名‘, ‘超级鹰用户名的密码‘, ‘96001‘)    #用户中心>>软件ID 生成一个替换 96001
#     im = open(‘a.jpg‘, ‘rb‘).read()                                                    #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
#     print chaojiying.PostPic(im, 1902)        

# 传入参数
def getCodeImgText(imgPath,imgType):

    #   用户的信息 密码  id
    chaojiying = Chaojiying_Client(‘bobo328410948‘, ‘bobo328410948‘, ‘899370‘)#用户中心>>软件ID 生成一个替换 96001
    im = open(imgPath, ‘rb‘).read()#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    return chaojiying.PostPic(im,imgType)[‘pic_str‘]
# 获取验证码  参考实例

# import requests
# import random
# from lxml import etree
# headers={
#     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
# }

# # 获取验证码图片  登录地址获取

# url=‘https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx‘

# page_text=requests.get(url=url,headers=headers).text
# tree=etree.HTML(page_text)
# img_src=‘https://so.gushiwen.org‘+tree.xpath(‘//*[@id="imgCode"]/@src‘)[0]

# img_data=requests.get(url=img_src,headers=headers).content
# with open(‘codeImg.jpg‘,‘wb‘) as fp:
#     fp.write(img_data)

# #进行验证码的识别   根据不同类型  选取不同参数值
# getCodeImgText(‘codeImg.jpg‘,1004)

# {‘err_no‘: 0,
#  ‘err_str‘: ‘OK‘,
#  ‘md5‘: ‘970e041fa158bcad2efd479b94308594‘,
#  ‘pic_id‘: ‘9076217532357600191‘,
#  ‘pic_str‘: ‘l5vg‘}
import requests
import random
from lxml import etree
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

# 添加session
session=requests.Session()

# 获取验证码图片  登录地址获取

url=‘https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx‘

page_text=session.get(url=url,headers=headers).text
tree=etree.HTML(page_text)
img_src=‘https://so.gushiwen.org‘+tree.xpath(‘//*[@id="imgCode"]/@src‘)[0]

img_data=session.get(url=img_src,headers=headers).content
with open(‘codeImg.jpg‘,‘wb‘) as fp:
    fp.write(img_data)

# <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="dysU8FT3M/c3eKDVrUAE67+EnvHnTNDMuBq93Ox3GtOEtATQ1Ln9FhzjUFkbxlwwCDQ2+XVGO2liru9sOke6bsYKRz8nR1dyqzYGPkjoR87PcgiETz2lAGQd/gg=">

#  运行发现依然没有登录上,去前端查询  修改 data 中的参数    (动态变化的请求参数)

#解析动态变化的请求参数
__VIEWSTATE = tree.xpath(‘//input[@id="__VIEWSTATE"]/@value‘)[0]
__VIEWSTATEGENERATOR = tree.xpath(‘//input[@id="__VIEWSTATEGENERATOR"]/@value‘)[0]
# print(__VIEWSTATE,__VIEWSTATEGENERATOR)   

#进行验证码的识别   根据不同类型  选取不同参数值
code_text=getCodeImgText(‘codeImg.jpg‘,1004)
print(code_text)
# 模拟登录
url=‘https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx‘

#  运行发现依然没有登录上,去前端查询发现不是固定值  修改 data 中的参数    (动态变化的请求参数)

data={
    ‘__VIEWSTATE‘: __VIEWSTATE,
    ‘__VIEWSTATEGENERATOR‘:__VIEWSTATEGENERATOR,
    ‘from‘: ‘http://so.gushiwen.org/user/collect.aspx‘,
    ‘email‘: ‘[email protected]‘,
    ‘pwd‘: ‘bobo328410948‘,
    ‘code‘: code_text,
    ‘denglu‘: ‘登录‘,
}

main_page_text=session.post(url=url,headers=headers,data=data).text
with open(‘./main.html‘,‘w‘,encoding=‘utf-8‘) as fp:
    fp.write(main_page_text)

# 总结
# 有哪些反爬机制: cookie   动态请求参数    验证码

线程池  异步爬取

# flask服务器代码:

from flask import Flask

from time import sleep

app=Flask(__name__)

@app.route("/aaa")
def index1():
    sleep(2)
    return ‘hello aaa‘

@app.route("/bbb")
def index2():
    sleep(2)
    return ‘hello bbb‘

@app.route("/ccc")
def index3():
    sleep(2)
    return ‘hello ccc‘

app.run()
# 提升requests模块爬取数据的效率

# 普通效果展示
import requests
import time

headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

urls = [
    ‘http://127.0.0.1:5000/aaa‘,
    ‘http://127.0.0.1:5000/bbb‘,
    ‘http://127.0.0.1:5000/ccc‘,
]

start=time.time()
for url in urls:
    page_text=requests.get(url=url,headers=headers).text
    print(page_text)

print(time.time()-start)       
# 基于线程池实现异步爬取

from multiprocessing.dummy import Pool  #线程池模块

import requests
import time

headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}

#必须只有一个参数
def my_requests(url):
    return requests.get(url=url,headers=headers).text

start = time.time()

urls = [
    ‘http://127.0.0.1:5000/aaa‘,
    ‘http://127.0.0.1:5000/bbb‘,
    ‘http://127.0.0.1:5000/ccc‘,
]

pool = Pool(3)
#map:两个参数
#参数1:自定义的函数,必须只可以有一个参数
#参数2:列表or字典
#map的作用就是让参数1表示的自定义的函数异步处理参数2对应的列表或者字典中的元素

page_text=pool.map(my_requests,urls)
print(page_text)

print(time.time()-start)

对比:

原文地址:https://www.cnblogs.com/XLHIT/p/11305169.html

时间: 2024-11-01 11:35:30

爬虫 Connection 代理 cookie 验证码的相关文章

反反爬虫 IP代理

0x01 前言 一般而言,抓取稍微正规一点的网站,都会有反爬虫的制约.反爬虫主要有以下几种方式: 通过UA判断.这是最低级的判断,一般反爬虫不会用这个做唯一判断,因为反反爬虫非常容易,直接随机UA即可解决. 通过单IP频繁访问判断.这个判断简单,而且反反爬虫比较费力,反爬虫绝佳方案.需采用多IP抓取. 通过Cookie判断,例如通过会员制账号密码登陆,判断单账号短时间抓取次数判断.这个反反爬虫也很费力.需采用多账号抓取. 动态页面加载.这个考验前端工程师的功底,如果前端写的好,各种JS判断,各种

快速构建Python爬虫IP代理池服务

在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来.不过呢,闲暇时间手痒,所以就想利用一些免费的资源搞一个简单的代理池服务. 1.问题 代理IP从何而来? 刚自学爬虫的时候没有代理IP就去西刺.快代理之类有免费代理的网站去爬,还是有个别代理能用.当然,如果你有更好的代理接口也可以自己接入. 免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取

python 网络爬虫session处理cookie,代理IP,云打码介绍

一.基于requests模块的cookie操作(session处理cookie) cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie. cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面.我们经常会在此时设置30天内记住我,或者自动登录选项.那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,

爬虫4:cookie登陆并爬取学习成绩

最近项目太忙了,都没空继续学习爬虫,前几天实验了各种姿势带cookie去登陆,都没有成功,不明觉厉 依然没有放弃,今天用同样的办法登陆以前大学的网站居然成功了,我真是一脸懵逼 又看了一遍以前的学习成绩,真是恨不得给自己两耳屎,青春都让狗吃了 哦,对了,以前还有一段学selenium的学习笔记,空了整理放到博客园里面来 # -*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup head={'cookie':'填入抓包抓

Python爬虫模拟登录带验证码网站

问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白cookie的作用,cookie是某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据.因此我们需要用Cookielib模块来保持网站的cookie. 3.这个是要登陆的地址 http://202.115.80.153/ 和验证码地址 http://202.115.80.15

session cookie 验证码实现

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Blog.UI { using System.Drawing; using Blog.Common; /// <summary> /// Vcode 的摘要说明 /// </summary> public class Vcode : IHttpHandler,System.Web.Session

Python爬虫入门之Cookie的使用

本节我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了. 在此之前呢,我们必须先介绍一个opener的概念. 1.Opener 当你获取一个URL你使用一个opener(一个urllib2.Ope

登录网站爬虫(保持Cookie不变)

平时经常需要到学校的信息门户去查看课表及其他信息,于是想做一个爬虫 ,可以自动替我登录并且得到这些信息,于是今天动手写了一个爬虫: 首先登录学校的信息门户:http://cas.whu.edu.cn/authserver/login?service=http://my.whu.edu.cn 然后这里我随便输入账号名和密码,来看看登录时浏览器都做了些什么.这里我使用的是FireFix浏览器以及HttpFox插件,如果用Chrome的话,谷歌下也有很棒的插件,IE的话推荐HTTPWatch. 从Ht

爬虫中代理的设置问题介绍

下面我们来梳理一下这些库的代理的设置方法. 1.获取代理 在做测试之前,我们需要先获取一个可用代理,搜索引擎搜索“代理”关键字,就可以看到有许多代理服务网站,在网站上会有很多免费代理,比如西刺:http://www.xicidaili.com/,这里列出了很多免费代理,但是这些免费代理大多数情况下都是不好用的,所以比较靠谱的方法是购买付费代理,很多网站都有售卖,数量不用多,买一个稳定可用的即可,可以自行选购. 或者如果我们本机有相关代理软件的话,软件一般会在本机创建 HTTP 或 SOCKS 代