python学习笔记(二十一) 爬虫基础(1):http请求,json、简单爬虫、设置超时

目录

一、http请求:

1、get请求:

2、post请求

二、json数据解析:

三、爬虫

url爬取网页

四、设置超时



一、http请求:

使用场景:进行客户端与服务端之间的消息传递时使用

GET:通过url网址传递信息,可以直接在url网址上添加要传递的信息
POST:可以向服务器提交数据,是一种比较流行/安全的数据传递方式
PUT:请求服务器存储一个资源,通常要指定存储位置
DELETE:请求服务器删除一个资源
HEAD:请求获取对应的http报头信息
OPTIONS:可以获取当前url

1、get请求:

'''
特点:把数据拼接到请求路径的后面传递给服务器

'''

import urllib.request
url = "http://www.lczha.top:8080"
response = urllib.request.urlopen(url)
data = response.read().decode("utf-8")
print(data)

2、post请求


特点:把参数进行打包,单独传输

优点:数量大,安全(当对服务器数据进行修改时建议使用post)

缺点:速度慢


import urllib.request
import urllib.parse#对参数进行打包

#将要发送的数据合成一个字典
#字典的键值网址里找,一般为input标签的name

url = "http://www.sunck.wang"
data = {
	"username":"sunck",
	"password":"666"
}

#对要发送的数据进行打包
postData = urllib.parse.urlencode(data).encode("utf-8")

#请求体
req = urllib.request.Request(url,data=postData)

req.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50")
response = urllib.request.urlopen(req)
print(response.resd().decode("utf-8"))

二、json数据解析:

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON语法规则

在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

对象表示为键值对
数据由逗号分隔
花括号保存对象
方括号保存数组
JSON键/值对

JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:

一种保存数据的格式

作用:可以保存本地的json文件,页可以将json串进行传输,通常将json称为轻量级的传输方式

json文件组成:
{}代表对象(字典)
[] 代表列表
: 代表价值对
,分隔两个部分

import json

# 将json格式的字符串转换成python对象
# jsonstr = '{"name":"boynextdoor","age":33,"hobby":["money","fight","sleep"],"parames":{"a":1,"b":2}}'
#
# jsondata = json.loads(jsonstr)
# print(jsondata)
# print(type(jsondata))
# print(jsondata['hobby'])


#将python对象转换成json格式的字符串
jsonstr = {"name":"boynextdoor","age":33,"hobby":["money","fight","sleep"],"parames":{"a":1,"b":2}}
jsondata = json.dumps(jsonstr)
print(jsondata)
print(type(jsondata))

三、爬虫

网络爬虫的组成:
1、控制节点:叫做爬虫中央控制器,主要负责根据url地址分配线程,并调用爬虫节点进行具体的爬行;
2、爬虫节点:根据相关算法,对网页进行具体爬行,主要包括下载网页以及对网页的文本处理,爬行后会将对应的爬行结果存储到对应的资源库中
3、资源库组成:存储爬虫爬虫爬到的响应数据,一般为数据库


爬虫设计思路:
1、首先确定需要爬的网页url地址;
2、通过http协议来获取对应的html页面
3、提取http页面里的有用数据,如果是需要的数据就保存起来,里面如果是其他的url,那么就继续执行第二步。


需求:
1、python基本语法:
2、如何抓取页面:http请求,urllib处理后的请求可以模拟浏览器发送请求,获取服务器响应的文件
3、解析服务器响应的内容:re、xpath、beautifulsoup4,jsonpatj,pyquery,目的是使用某种描述性语法来提取匹配规则的数据
4、如何采用动态html、验证码的处理:1、通用的动态页面采集:selenium+PhantomJS无界面浏览器,模拟真实浏览器加载js',ajax等非静态页面数据
                           2、tesseract:机器学习库,机器图像识别系统(识别图片中的文本)
5、scrapy框架:中国常见的框架Scrapy,Pyspider
            高定制高性能(异步网络框架twisted),所以数据下载速度非常快,提供了数据存储,数据下载、提取规则等组件
6、分布式策略:scrapy-redis
            在scrapy的基础上添加了一套以redis数据库为核心的一套组件,让scrapy框架支持分布式的功能,主要在redis里做请求指纹去重,请求分配、数据临时存储


反爬虫技术:user-agent
         代理
         验证码
         动态数据加载
         加密数据


通用网络爬虫:
1、搜索引擎用的爬虫系统;
2、目标:尽可能把互联网上的所有网页下载下来,放到本地服务器里形成备份。再对这些网页做相关处理(提取关键字、去广告等),最后提供一个用户检测接口
3、抓取流程:*首先选取一部分已有的url,把这些url放到待爬队列;
          *从队列中提取出这些url,然后解析dns得到主机IP,然后去这个IP对应的服务器下载html页面,保存到搜索引擎的本地服务器中,之后把爬过去的url放入已爬取队列
          *分析这些网页内容,找出网页中的url链接,继续执行第二步,直到爬取条件结束

4、搜索引擎如何获取一个新网站的url:*主动向搜索引擎提交网址(百度网站提交平台)
                           *在其他网站里设置网站的外链接
                           *搜索引擎会和dns服务商合作,可以快速收录新的网站

5、robots协议:大型爬虫遵守的网页爬取权限协议

url爬取网页

import urllib.request

#向指定的url地址发起请求,并返回服务器响应的数据(文件的对象)
response = urllib.request.urlopen("http://www.baidu.com")

#读取文件的全部内容,会把读取到的数据赋值给一个字符串变量
# data = response.read()
# print(data)
# print(type(data)) #byte

#将爬取到的网页写入文件
#with open(r"F:\学习存放\untitled\爬虫\爬虫\file\file.html","wb") as f:
#	f.write(data)

#读取一行
#data = response.readline()


#读取文件的全部内容,会把读取到的数据赋值给一个列表变量
data = response.readlines()
print(data)
print(type(data))
print(len(data))

#response属性:返回当前环境的有关信息
# # print(response.info())

#返回状态码
print(response.getcode())
# if response.getcode() ==200 or response.getcode()==304:
# # 	#处理网页信息
# # 	pass

#返回当前正在爬取的url地址
print(response.geturl())
url = r"https://www.baidu.com/"

#解码
newUrl = urllib.request.unquote(url)
print(newUrl)
#编码
newUrl2 = urllib.request.quote(newUrl)
print(newUrl2)

四、设置超时

import urllib.request

#如果网页长时间未响应,系统判断超时,无法爬取
for i in range(1,100):
	try:
		response = urllib.request.urlopen("http://www.baidu.com",timeout=0.5)
		print(len(response.read().decode("utf-8")))
	except:
		print("请求超时,爬取下一个")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值