网络爬虫(一)

一、简介

  1、robot协议(爬虫协议):这个协议告诉引擎哪些页面可以抓取,哪些不可以

-User-agent:爬虫引擎

-allow:允许robot访问的URL

-disallow:禁止访问的URL

  2、爬虫约束:过快/频繁的网络爬虫会对服务器产生巨大的压力,网站可能封锁你的IP,或者采取法律行动,所以需要将请求速度限定在一个合理范围内

  3、爬虫流程:

  -获取网页:给网页一个网址发送请求,该网址会返回整个网页的数据;

  -解析网页(提取数据):从整个网页中提取想要的数据

  -存储数据:将数据存储下来,可以存在csv中,或者数据库中

二、新建爬虫

  1、获取网页:

  -导入request类,使用requests.get(link,headers=headers)获取网页

  ·requests的header伪装成浏览器访问;

  ·r是requests的Response回复对象,从中获取想要的信息,r.text是获取的网页内容代码

  2、提取需要的数据:需要用到 bs4库的BeautifulSoup类,后续会将到。

三、静态页面抓取

   1、参数介绍:

  -r.text:服务器响应的内容,会自动根据响应头部的字符编码进行解码
  -r.encoding:服务器内容使用的文本编码;
  -r.status_code:用于检测响应的状态码.
·返回200,表示请求成功;
·返回4xx,表示客户端错误;
·返回5xx,表示服务器错误响应
  -r.content:字节方式的响应体,会自动解码gzip和deflate编码的响应数据;
  -r.json:是Requests中的内置的JSON解码器

四、代码讲解:

# 1-Request库及Reponse对象:
import requests r=requests.get("http://www.baidu.com") # r,服务器响应对象 get方法
print(r.url) # http://www.baidu.com/
print(r.encoding) # ISO-8859-1 文本编码
print(r.status_code) # 200 响应状态码 200--请求成功 4xx--客户端错误 5xx--服务器错误
# print(r.text) # 服务器响应的代码
# 2-定制Requests

# 1)传递 url参数
# 2)定制请求头
# 3)发送 Post请求
# 4)超时
# 2-1)传递 url参数:
import requests # 方式1:
url='http://httpbin.org/get?key1=value1' # 转义字符 r有没有都行
r=requests.get(url)
# 方式2:
parm_dict={'key1':'value1','key2':'value2'}
url='http://httpbin.org/get' # url以 /get结尾
r=requests.get(url,params=parm_dict) print(r.status_code) # 200
# 2-2)定制请求头
# 请求头提供了关于请求,响应,或其他发送实体的信息。
# 1)打开网址:www.santostang.com
# 2)右键--检查元素--网络--左侧资源里单击要请求的网页www.santostang.com
# 3)点击右侧的‘消息头’,并复制。 # 复制内容如下:
# Host: www.santostang.com
# User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
# Accept: text/css,*/*;q=0.1
# Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
# Accept-Encoding: gzip, deflate
# Connection: keep-alive
# Cookie: Hm_lvt_752e310cec7906ba7afeb24cd7114c48=1591794256,1591794423; PHPSESSID=1plcgphukjij28c42ns9octmq2; Hm_lpvt_752e310cec7906ba7afeb24cd7114c48=1591794423 # 提取上面内容的重要信息,得到如下的 headers:
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Host':'www.santostang.com'
} url='http://www.santostang.com'
r=requests.get(url,headers=headers)
print(r.status_code) # 200
# 2-3)发送Post请求
# get方法发送请求会将一些信息暴露在url里很不安全,此时可以使用 Post方法,发送编码为表单形式的请求。
# 只需要将数据存储在字典中,并传递给Post方法的data参数就可以: import requests headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Host':'www.santostang.com'
}
parm_dict={'key1':'value1','key2':'value2'}
url='http://httpbin.org/post' # url以 /post结尾
r=requests.post(url,data=parm_dict,headers=headers)
print(r.status_code) # 200
print(r.text)

200

{

"args": {},

"data": "",

"files": {},

"form": {

"key1": "value1",

"key2": "value2"

},

"headers": {

"Accept": "/",

"Accept-Encoding": "gzip, deflate",

"Content-Length": "23",

"Content-Type": "application/x-www-form-urlencoded",

"Host": "www.santostang.com",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",

"X-Amzn-Trace-Id": "Root=1-5ee5c1c1-fd164ea0042482a055a977c0"

},

"json": null,

"origin": "116.153.38.222",

"url": "http://www.santostang.com/post"

}

# 2-4)超时
# 有时候爬虫会遇到服务器长时间不返回,这时就会一直等待,造成爬虫程序没有顺利执行,此时可以给get或post方法的 timeout参数设置一个时间限制:
# 一般可以设置为20
# import requests
# url='http://httpbin.org/get'
# r=requests.get(url,timeout=0.00001) # 为了观察报错效果,故意设置的非常小 # 报错信息为:
# ConnectTimeout: HTTPConnectionPool(host='httpbin.org', port=80):
# Max retries exceeded with url: /get (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.
# HTTPConnection object at 0x000001DE11B38160>, 'Connection to httpbin.org timed out. (connect timeout=1e-05)')) # 用 try except处理如下:
import requests
parm_dict={'key1':'value1','key2':'value2'}
url='http://httpbin.org/post' # url以 /post结尾
try:
r=requests.post(url,data=parm_dict,timeout=0.00001)
print(r.status_code)
print(r.text)
except:
print('请求超时,请尝试将timeout设置的大一些试试')
请求超时,请尝试将timeout设置的大一些试试

Spider_基础总结1_Request(get/post__url传参_headers_timeout)+Reponse的更多相关文章

  1. PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

    <?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo &q ...

  2. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  3. .NET 内存基础(通过内存体验类型、传参、及装箱拆箱)

    该随笔受启发于<CLR Via C#(第三版)>第四章4.4运行时的相互联系 一.内存分配的几个区域 1.线程栈 局部变量的值类型 和 局部变量中引用类型的指针(或称引用)会被分配到该区域 ...

  4. [妙味JS基础]第五课:函数传参、重用、价格计算

    知识点总结 函数传参,传的参数=数据类型(即:数值.字符串.布尔.函数.对象.未定义) 通过传参来重用代码 1.尽量保证 HTML 代码结构一致,可以通过父级选取子元素 2.把核心主程序实现,用函数包 ...

  5. JS基础之传参(值传递、对象传递)

    一.概念 我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strategy). ...

  6. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  7. python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块

    ---恢复内容开始--- 一.函数相关: 1.1位置参数: ef hello(name,sex,county='china'): pass #hello('hh','nv') #位置参数.默认参数 1 ...

  8. [Vue 牛刀小试]:第十三章 - Vue Router 基础使用再探(命名路由、命名视图、路由传参)

    一.前言 在上一章的学习中,我们简单介绍了前端路由的概念,以及如何在 Vue 中通过使用 Vue Router 来实现我们的前端路由.但是在实际使用中,我们经常会遇到路由传参.或者一个页面是由多个组件 ...

  9. Python基础--动态传参

    形参的顺序: 位置 *arg     默认值  **args  ps:可以随便搭配,但是*和**以及默认值的位置顺序不能变 *,** 形参:聚合 位置参数* >>元祖 关键字** > ...

随机推荐

  1. OpenSSL编程模型

    相关头文件: #include <openssl/ssl.h>#include <openssl/err.h> 客户端程序编写流程: 服务端编写流程: 产生私钥:# opens ...

  2. 用IPV6隧道连接IPV4孤岛

    hostA和hostB之间是IPV6连接的,但是之前的服务只能支持IPV4,兼容IPV6比较困难.所以用隧道实现hostA和hostB之间用IPV4连接. hostA如下: ip -6 addr ad ...

  3. 【故障公告】博客系统升级到 .NET 5.0 引发的故障

    昨天晚上我们将博客系统从 .NET Core 3.1 升级到了 .NET 5.0 ,本来是一次很有信心的升级,但没有想到在今天下午访问高峰时竟然出现了故障,大量请求访问速度变慢或者因为下面的数据库连接 ...

  4. 初试Python

    01 Python简介 Python是一种跨平台的计算机程序设计语言.于1989年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido). python具有非常多并且 ...

  5. buuctf-misc-[BJDCTF 2nd]圣火昭昭-y1ng 1

    开局一张图片,flag全靠猜,那这个是不是和outguess工具有关呢?于是我们显示查看了图片的详细信息 看到是新佛曰,于是我们用新佛曰论禅解密:http://hi.pcmoe.net/buddha. ...

  6. Hugo+Github 搭建个人博客(Windows环境下)

    目录 Hugo+Github 搭建个人博客(Windows环境下) 1.前言 2.Differences 2.1 https vs SSH 2.2 新建的github的仓库名必须为 用户名+githu ...

  7. jQuery load() 中文乱码

    1.使用editplus创建了demo.txt (ANSI保存的), $("#div1").load("demo.txt");//div显示中文乱码---> ...

  8. Hadoop 指令

    date: 2018-04-30 09:07:56 updated: 2018-04-30 09:07:56 1.ls hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件 had ...

  9. vue 用别名取代路径引用

    在项目开发过程中有可能很多包是没有放在npm上的,许多包需要下载到本地引用,这样一来我们只能通过require的方式来引用文件,但是路径的名字就会很长 例如 import Select from '. ...

  10. U137971 公司搬迁 - 并查集 奇偶性

    题目描述 因为人员规模扩大,T公司准备搬到新的写字楼去,写字楼分为A座和B座,n名不同工号的员工x(p1,p2,p3...pn) 按照下面两个规则确定在A座或者B座进行办公:(1)如果工号为x的员工在 ...