爬虫

简介:

浏览器发送http请求,去后端服务器获取到数据之后只能从浏览器中看,如果要把需要的数据保存到本地,存到我们自己库中就可以用到爬虫

百度本质就是一个大爬虫(搜索),在输入框中输入搜索内容,实际是从百度的数据库搜索出来的

百度数据库的数据是从互联网爬下来的,百度这个爬虫一刻不停的在互联网爬数据,爬完就存到它的库里(seo优化,优化我们的网站能够被搜索引擎先搜到,排的很靠前),尽可能被百度爬虫,并且容易搜索到,seo(免费的)和sem(充钱,把你放前面)—》,当时爬虫爬取这个网页这一刻,网页的样子—》保留这个网页地址,当你点击标题,跳转到这个网页,完成了你的搜索 伪静态

爬虫的本质—-》模拟发送http请求(浏览器携带什么,我们也要携带什么)—->服务器返回数据—》对数据进行清洗—》入库 后续操作是别的—》分析数据–》数据分析

爬虫协议:君子协议—》大家遵循这个协议,就不违法–》规定了我的网站,什么能爬,什么不能爬

爬虫本质跟用浏览器访问没什么区别

requests模块介绍,发送get请求

所有语言都可以做爬虫---》python简单一些---》库多
模拟发送http请求的库,requests库----》大佬基于python内置库 urllib(麻烦) 封装--》requests

安装
pip3 install requests

模拟发送get请求
import requests

res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html')
print(res.text)  # 响应体的内容打印出来了

get地址中携带参数

## 2 get 请求中携带参数
res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html',
                 params={'name':'lqz','age':18}
                 )
# ?name=lqz&age=18拼到路径后面
print(res.text)  # 响应体的内容打印出来了
url编码和解码
https://www.baidu.com/baidu?wd=python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81

把字段中文编码后转成 name=%E5%88%98%E6%B8%85%E6%94%BF&age=18
from urllib.parse import urlencode
d={'name':'刘清政','age':18}
res=urlencode(d)
print(res)

只想单独对中文编码和解码
from urllib.parse import quote, unquote

编码
name='刘清政'
res=quote(name)
print(res)

解码
s='python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81'
print(unquote(s))

携带请求头

3 携带请求头
携带请求头-->重要的key:
User-Agent:客户端浏览器的类型版本信息,操作系统版本,django中如何取出请求头--》META---》中间件--》存到数据库--》饼形图--》统计你们网站近一个月客户端类型
referer:图片防盗链 Referer: https://www.lagou.com/wn/zhaopin
记录的是上一个访问的地址---》反扒:如果上一个访问的地址不是自己的地址,认为不是正常请求就禁止

header = {
     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
     'Accept-Encoding': 'gzip, deflate, br',
}
res = requests.get('https://dig.chouti.com/',headers=header)
with open('chouti.html','wb') as f:
    f.write(res.content)
print(res.text)

携带cookie

## 本身cookie是请求头中的值,那么就可以执行放在请求头中,但是cookie经常用,也可以单独是一个参数
模拟点赞
header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
    # 'Cookie': ""
}
data={
    'linkId': '34934736'
}
res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header)
res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header,cookies={'key':'value'})
print(res.text)

发送post请求模拟登陆

#5  模拟登陆某网站
data = {
    'username': '616564099@qq.com',
    'password': 'lqz123',
    'captcha': 'kyca',
    'remember': 1,
    'ref': 'http://www.aa7a.cn/',
    'act': 'act_login',
}
res = requests.post('http://www.aa7a.cn/user.php',data=data)
print(res.text)
print(res.cookies) # 登陆成功返回的cookie,这个cookie是登陆过后的,以后拿着这个cookie就可以模拟登陆后操作

res2=requests.get('http://www.aa7a.cn/',cookies=res.cookies)
print('616564099@qq.com' in res2.text)

每次都要手动携带cookie,麻烦,使用requests提供的session 方法

session=requests.session()
以后需所有请求都用session对象发送,不需要手动处理cookie
data = {
    'username': 'ee@qq.com',
    'password': 'lqz123',
    'captcha': 'kyca',
    'remember': 1,
    'ref': 'http://www.aa7a.cn/',
    'act': 'act_login',
}
res = session.post('http://www.aa7a.cn/user.php',data=data)
print(res.text)
print(res.cookies) # 登陆成功返回的cookie,这个cookie是登陆过后的,以后拿着这个cookie就可以模拟登陆后操作

res2=session.get('http://www.aa7a.cn/')
print('616564099@qq.com' in res2.text)

响应对象

## 6 响应对象
import requests
respone=requests.get('http://www.jianshu.com')
respone属性
print(respone.text)  # 返回响应体的文本内容
print(respone.content)# 返回响应体的二进制内容

print(respone.status_code)# 响应状态码
print(respone.headers)# 响应头
print(respone.cookies)# 响应的cookie
print(respone.cookies.get_dict())# 响应的cookie转成字典
print(respone.cookies.items())

print(respone.url) # 请求地址
print(respone.history) # 了解---》如果有重定向,列表,放着重定向之前的地址

print(respone.encoding) # 页面的编码方式:utf-8   gbk
response.iter_content()  # content迭代取出content二进制内容,一般用它存文件

编码问题(一般不会有问题)

请求回来的数据,res.text 打印的时候乱码 ,因为没有指定编码,默认已utf-8编码
解决
response.encoding='gbk'

获取二进制数据

下载图片,视频
下载图片
header={
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}

res=requests.get('https://tva1.sinaimg.cn/mw2000/9d52c073gy1h1v6lmny8nj20j60pjtdh.jpg',headers=header)
with open('mv.jpg','wb') as f:
    # f.write(res.content)
    for line in res.iter_content(100):
        f.write(line)

解析json

## 8 json格式解析
import json

data = {
    'cname': '',
    'pid': '',
    'keyword': '上海',
    'pageIndex': 1,
    'pageSize': 10,
}
res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data)
j = json.loads(res.text)
print(j['Table'][0]['rowcount'])

res= requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data).json()
print(res['Table'][0]['rowcount'])

ssl认证

之前网站,有些没有认证过的ssl证书,我们访问需要手动携带证书
跳过证书直接访问
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)
手动携带
import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)

12 使用代理

爬虫,速度很快,超过频率限制---》使用代理,切换ip---》封ip封的也是代理的ip,我的ip没问题

网上有一个python开源的代理池---》自己搭建起来https://github.com/jhao104/proxy_pool
写个django,用户访问就返回用户的ip地址--》放到公网上,用manage.py跑起来---》访问
客户端使用request加代理访问你的django,验证代理是否使用成功

proxies = {
    'http': '39.103.217.44:59886', # http或https代理
}
respone=requests.get('https://www.baidu.com',proxies=proxies)

print(respone.status_code)

Original: https://www.cnblogs.com/elijah-li/p/16399105.html
Author: elijah_li
Title: 爬虫

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612808/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • NTP服务器实现

    时间服务器是一种计算机网络仪器,它从参考时钟获取实际时间,再利用计算机网络把时间信息传递给用户。虽然还有一些比较少用或过时的协议仍然在使用,但现时最重要及广泛使用,作为时间信息发送…

    Linux 2023年6月7日
    080
  • 计算机辅助数据绘图(matlabpythonjs)

    1. matlab绘图 官方说明:https://ww2.mathworks.cn/help/matlab/creating_plots/types-of-matlab-plots…

    Linux 2023年6月14日
    0117
  • Linux系统卡死后紧急处理

    前言:Linux系统卡死了的情况有很多,最常见的是系统负载过高导致的。还可以运行内存耗用极大的程序(如虚拟机),也会迅速提升系统负载。注意:不能再试图依赖任何图形界面的东西,如 G…

    Linux 2023年6月7日
    097
  • k4t系统架构 & 部署最佳实践

    《kaiiit船长》 容器自动管理软件 (k4t,国产k8s) k4t系统架构 & 部署最佳实践 文档修订时间: 2021-11-20 关键词 : k4t kaiiit 船…

    Linux 2023年6月13日
    0100
  • CentOS7安装MYSQL8.X详细教程

    1-首先查看系统是否存在mysql,无则不返回 rpm -qa|grep mysql 2-安装wget yum -y install wget 3-抓取mariadb并删除包,无则…

    Linux 2023年5月27日
    079
  • 模拟重装Kubernetes(k8s)集群:删除k8s集群然后重装

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    082
  • 每天一个 HTTP 状态码 202

    202 Accepted 表示服务器已经接受了这个请求,但是还不确定… 202 Accepted 202 Accepted 表示服务器已经接受了这个请求,但是还不确定这…

    Linux 2023年6月7日
    0101
  • Error: Unable to access jarfile 运行jar包报错

    1、可能是执行路径有误 错误 修改后,需使用绝对路径 2、决解1后,还报以下错误,就是你的安装的JDK与jar包中的JDK不是同一版本。idea中有自带的JDK与我们安装的JDK版…

    Linux 2023年6月14日
    0918
  • 【已解决】Windows环境下启动redis服务失败

    在redis安装目录下打开cmd窗口: 依次输入: redis-cli.exe shutdown exit redis-server.exe redis.windows.conf …

    Linux 2023年6月14日
    061
  • 自动化集成:Pipeline整合Docker+K8S

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述流水线集成K8S用法。 一、背景…

    Linux 2023年5月27日
    0164
  • Netty源码解读(三)-NioEventLoop

    先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,…

    Linux 2023年6月7日
    092
  • acl/客户端缓存/多级缓存

    redis6安装注意点 我们课程里忽略了,就不去安装了,仅仅只提供安装文档,redis6的安装其实和redis5安装差不多,只是需要注意gcc的版本需要提高,不然编译会出错。参考慕…

    Linux 2023年5月28日
    091
  • UWP 在XAML设计器中使用设计时数据

    1. 功能解释 有些布局没有数据很难进行可视化。 在本文档中,我们将审查从事桌面项目的开发人员可在 XAML 设计器中模拟数据的一种方法。 此方法是使用现有可忽略的”d…

    Linux 2023年6月13日
    095
  • 每周一个linux命令(ping)

    基础环境 ping命令介绍 ping命令主要用来…

    Linux 2023年6月8日
    088
  • CMU15-445 数据库导论 Storage01

    CMU15-445 01 Storage 1. 参考资料: [1] CMU15-445:Database Systems [Andy Pavlo] https://15445.co…

    Linux 2023年6月6日
    091
  • Linux文本处理相关命令

    一、文本处理命令 Linux sort命令用于将文本文件内容加以排序。 sort 可针对文本文件的内容,以行为单位来排序。 语法格式如下: sort [参数]…[文件] 相关参…

    Linux 2023年5月27日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球