05爬虫-requests模块基础(2)

今日重点:

    1、代理服务器的设置

    2、模拟登陆过验证码(静态验证码)

    3、cookie与session

    4、线程池


1、代理服务器的设置

  有时候使用同一个IP去爬取同一个网站,久了之后会被该网站服务器屏蔽。那么我们应该1怎么处理这个问题呢?

  解决思路:

      如果我们爬取网站,对方服务器显示的是别人的IP地址,那么即使对方服务器把IP禁掉,屏蔽。也无关紧要,我们可以继续换其他的IP地址继续爬取。

因此使用代理服务器,就可以解决问题。

      网上有很多代理服务器的网站一般情况花钱比较安全,当然,你要识别这个IP是否是安全的。

  代理类型:

      HTTP:只能发送http协议的

      HTTPS:发送HTTPS协议的

  匿名度:

      透明:对方服务器能知道你用代理而且知道你的IP地址

      匿名:对方服务器知道你用代理,不知道你服务器

      高匿名:对方不知道你用代理。

  代理网站:

      https://www.kuaidaili.com/free/(快代理有免费的,不过还是危险)

      其余随便百度,网上有很多代理服务器

        查看本机ip,接下来测试代理ip

代理服务代码展示如下:

import requests

url = "https://www.baidu.com/s?wd=ip"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
}
#请求多携带一个proxies的参数,类型为http的键值对
response = requests.get(url = url,headers=headers,proxies={"http":"115.233.210.218:808"}).text
#存入当前目录下的文件
with open("./ip.html","w",encoding="utf-8") as fp:
    fp.write(response)
print(response)

看结果显示的ip地址就是我找的代理里面的地址。

2、模拟登陆过验证码(静态验证码)

  处理完代理问题,接下来比如我们爬取的网站需要登陆,然而登录多半都会出现让用户输入入验证码,因此我们需要用代码模拟出人输入验证码。

  在遇到验证码的时候,在实际的项目中,验证码的处理方式有三种:

    1)手动输入验证码。(对于小型的项目我们可以采取手动输入)

    2)通过编写程序自动识别验证码。(这样效率会很低,机器学习识别验证码)

    3)通过一些打码接口实现,让别人通过接口帮我们输入验证码,但是需要支付一点费用。

  但实现以上方式,均要分析验证码的图片从哪里来,是不是验证码也会夹带cookie(cookie,稍后会提到cookie)。只要分析完成,将验证码识别出来,作为动态参数传入

下面即将提交的数据中,那么就完成静态验证码(文字输入)验证。  

在这里可以有个大型平台,云打码(http://www.yundama.com/)充值了,添加软件,然后复制相关开发者python的源代码,登录自己的账号。识别的类型填入代码,将识别结果输出。作为动态参数传入。

   接下来解决登录的问题。因此引出(cookie)

3、cookie与session

   在爬虫的使用中,如果涉及登录等操作,经常会使用到Cookie。那么什么是Cookie呢?

简单来说,我们访问每一个互联网页面,都是通过HTP协议进行的,而HTTP协议是一个无状态协议,所谓的无状态协议即无法维持会话之间的状态。

比如,仅使用HTTP协议的话,我们登录一个网站的时候,假如登录成功了,但是当我们访问该网站的其他网页的时候,该登录状态则会消失,此时还需要再登录一次,只要页面涉及更新,就需要反复的进行登录,这是非常不方便的。

所以此时,我们需要将对应的会话信息,比如登录成功等信息通过- 些方式保存下来,比较常用的方式有两种:通过Cookie保存会话信息或通过Session保存会话信息。我们分别说一下这两种方式。

如果是通过Cookie保存会话信息,此时会将所有的会话信息保存在客户端,当我们访问同一个网站的其他页面的时候,会从Cookie中读取对应的会话信息,从而判断目前的会话状态,比如可以判断是否已经登录等。显然,这种方式我们会用到Cookie。

如果是通过Session保存会话信息,会将对应的会话信息保存在服务器端,但是服务器端会给客户端发SessionID等信息,这些信息一般存在客户端的Cookie中,当然,如果客户端禁止了Cookie,也会通过其他方式存储。但是,目前来说,大部分的情况还是会将这一部分的信息存到Cookie中。然后,用户在访问该网站其他网页的时候,会从Cookie中读取这一部分信息, 然后从服务器中的Session中根据这部分Cookie信息检索出该客户端的所有会话信息,然后进行会话控制。显然,使用Session的方式来保存会话信息,大部分的时候,还是会到Cookie。

通过前面的分析,可以看到,不管是通过哪种方式进行会话控制,在大部分时候,都会用到Cookie。比如在爬虫的登录中,如果没有Cookie,我们登录成功了一个网页,但如果我们要爬去该网站的其他网页的时候,仍然会是未登录状态,如果有了Cookie,当我们登录成功后,爬取该网站的其他网页时,则会保持登录状态进行内容的爬取。      

总结来说就是:

1)我们访问每一一个互联网页面,都是通过HTP协议进行的,而HTTP协议是一个无状态协议,所谓的无状态协议即无法维持会话之间的状态。
      2)会话信息控制比较常用的方式有两种:通过Cookie保存会话信息、通过Session保存会话信息。
      3)如果是通过Session保存会话信息,会将对应的会话信息保存在服务器端,但是服务器端会给客户端发SessionID等信息,这些信息一般存在客户端的Cookie中,当然,如果客户端禁止了Cookie,也会通过其他方式存储。但是,目前来说,大部分的情况还是会将这-部分的信息存到Cookie中。然后,用户在访问该网站其他网页的时候,会从Cookie中读取这一部分信息,然后从服务器中的Session 中根据这一部分 Cookie信息检索出该客户端的所有会话信息,然后进行会话控制。显然,使用Session的方式来保存会话信息,大部分的时候,还是会用的Cookie。
      4)如果要获得真实的登录地址,我们需要进行分析,分析方法主要有两种,第种方法是通过F12调出调试界面进行分析,第二种方法是使用工具软件进行分析,常用的工具软件有Fiddler(一个伪服务器,你的客户端发送的都要经过它传输)。

登录人人网:

import requests
if __name__ == "__main__":

    #登录请求的url(通过抓包工具获取)
    post_url = ‘http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471‘
    #创建一个session对象,该对象会自动将请求中的cookie进行存储和携带
    session = requests.Session()
   #伪装UA15675334817
    formdata = {
        ‘email‘: ‘15675334817‘,
        ‘icode‘: ‘‘,
        ‘origURL‘: ‘http://www.renren.com/home‘,
        ‘domain‘: ‘renren.com‘,
        ‘key_id‘: ‘1‘,
        ‘captcha_type‘: ‘web_login‘,
        ‘password‘: ‘02eb37d2b5474eb9b086c7cdea2adea2f3af747d674cb598c1fab6732a62e555‘,
        ‘rkey‘: ‘3c7c4d177b8f7edfa59e7f629fcee3bc‘,
        ‘f‘: ‘http%3A%2F%2Fwww.renren.com%2F972358414‘,
    }
    #使用session发送请求,目的是为了将session保存该次请求中的cookie
    session.post(url=post_url,data=formdata,headers=headers)

    get_url = ‘http://www.renren.com/972358414/profile‘
    #再次使用session进行请求的发送,该次请求中已经携带了cookie
    response = session.get(url=get_url,headers=headers)
    #设置响应内容的编码格式
    #将响应内容写入文件
    with open(‘./renren.html‘,‘w‘,encoding="utf-8") as fp:
        fp.write(response.text)

4、线程池

    基于multiprocessing.dummy线程池的数据爬取

练习:需求:爬取梨视频的视频信息

import requests
from lxml import etree
import re
import random
from multiprocessing.dummy import Pool

#爬取视频的下载和保存都需要等待很长时间 这时候 可以采取IO密集型多线程解决
#因此引入线程池
pool = Pool()

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

url = "https://www.pearvideo.com/category_1"

vedio_page = requests.get(url=url,headers=headers).text

tree = etree.HTML(vedio_page)
name_url = tree.xpath(‘//*[@id="listvideoList"]/ul/li/div/a/@href‘)

vedio_urls = []#存储视频的url

for i in name_url:
    vedios_url = "https://www.pearvideo.com/" + i
    res = requests.get(url=vedios_url,headers=headers).text
    tre = etree.HTML(res)
    ex = ‘srcUrl="(.*?)",vdoUrl‘
    vedio = re.findall(ex,res,re.S)[0]
    vedio_urls.append(vedio)
print(vedio_urls)
#使用线程池进行视频数据下载
def load(link):
    headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
}
    resul = requests.get(url=link,headers=headers).content
    return resul
video_data_list = pool.map(load,vedio_urls)
#使用线程池进行视频数据保存
def save(vedioa):
    headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
}
    name = str(random.randint(0,9999)) + ".mp4"
    with open(name,"wb") as fp:
        fp.write(vedioa)
        print(name,":下载成功")
pool.map(save,video_data_list)

pool.close()#关闭线程
pool.join()#继续下一个线程

总结:爬取梨视频思路,首先找到视频所在标签位置,在进入视频地址所在位置,接下来请求视频地址为空,仔细寻找发现视频的地址是由js控制显示的。

bs4与lxml都是对标签进行解析的,而我们需要的是js中的代码,因此我们需要用到正则表达式。正则表达式匹配出视频后缀为.mp4的。然后利用线程池

爬取下载数据,再利用线程池保存数据,二进制数据。(思路一定要分析清楚,才开始写代码,不然容易出现问题)

原文地址:https://www.cnblogs.com/lishuntao/p/11605667.html

时间: 2024-11-07 15:35:02

05爬虫-requests模块基础(2)的相关文章

爬虫-requests模块

requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高. 作用:模拟浏览器发请求. requests模块的使用流程 1.指定url 2.发起请求 UA伪装 请求参数的处理 3.获取响应数据 4.持久化存储 requrest模块基本知识点 import requests import json url = "www.baidu.com" headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Int

Python网络爬虫-requests模块(II)

有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/env python # -*- coding:utf-8 -*- import requests if __name__ == "__main__": #张三人人网个人信息页面的url url = 'http://www.renren.com/289676607/profile' #伪装UA

03 requests模块基础

1. requests 模块简介 什么是requests 模块 requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效.在爬虫领域中占据着半壁江山的地位.requests模块作用:模拟浏览器发请求. 为什么要使用requests 模块 因为在使用urllib模块的时候,会有诸多不便之处,总结如下: 手动处理url编码 手动处理post请求参数 处理cookie和代理操作繁琐 ...... 而使用requests模块的优势: 自动处理url编码 自动处理post请求参

爬虫requests模块 2

会话对象¶ 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能.所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升. (参见 HTTP persistent connection). 会话对象具有主要的 Requests API 的所有方法. 我们来跨请求保持一些 cookie: s = requests.Session()

爬虫基础之requests模块

1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互联网的世界里最有价值的便是数据, 谁掌握了某个行业的行业内的第一手数据, 谁就是该行业的主宰. 掌握了爬虫技能, 你就成了所有互联网信息公司幕后的老板, 换言之,它们都在免费为你提供有价值的数据. 1.3 robots.txt协议 如果自己的门户网站中的指定页面中的数据不想让爬虫程序爬取到的话,那么

爬虫学习 06.Python网络爬虫之requests模块(2)

爬虫学习 06.Python网络爬虫之requests模块(2) 今日内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 知识点回顾 xpath的解析流程 bs4的解析流程 常用xpath表达式 常用bs4解析方法 了解cookie和session - 无状态的http协议 如上图所示,HTTP协议 是无状态的协议,用户浏览服务器上的内容,只需要发送页面请求,服务器返回内容.对于服务器来说,并不关心,也并不知道是哪个用户的请求.对于一般浏览性的网页来说

python3 爬虫之requests模块使用总结

Requests 是第三方模块,如果要使用的话需要导入.Requests也可以说是urllib模块的升级版,使用上更方便. 这是使用urllib的例子. import urllib.request import json url = 'http://www.weather.com.cn/data/sk/101190408.html' res = urllib.request.urlopen(url)#发送请求 result = res.read().decode()#获取结果,结果是byte类型

Python学习---爬虫学习[requests模块]180411

模块安装 安装requests模块 pip3 install requests 安装beautifulsoup4模块 [更多参考]https://blog.csdn.net/sunhuaqiang1/article/details/65936616 pip install beautifulsoup4 初识requests模块   [更多参考]http://www.cnblogs.com/wupeiqi/articles/6283017.html requests.post(url=""

requests模块之基础语法

基础语法 发送请求 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块:  >>> import requests  然后,尝试获取某个网页.本例子中,我们来获取 Github 的公共时间线:  >>> r = requests.get('https://api.github.com/events')  现在,我们有一个名为 r 的 Response 对象.我们可以从这个对象中获取所有我们想要的信息. Requests 简便的 API