HTTP请求数据/爬虫

一.爬虫的定义
网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.
简单地说:就是用事先写好的程序去抓取网上所需的数据,这样的程序就叫网络爬虫.编写网络爬虫的程序员叫做爬虫工程师.
通用爬虫和聚焦爬虫

通用性的搜索引擎存在一定的局限性:
1.通用搜索引擎返回的都是网页,而大多数情况下,网页里的90%的内容对用户来说都是无用的
2.不同领域,不同背景的用户往往具有不同的检索和需求,搜索引擎无法提供针对具体某个用户的搜索结果.
3.万维网数据形式的丰富和网路技术的不断发展,图片,数据库,音频,视频多媒体等不同数据大量出现,通用搜索引擎对这些文件无能为力,不能很好的发现和获取.
4.通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询,无法准确理解用户的具体需求.
针对这些情况,聚焦爬虫技术得以广泛使用.

二.数据从何而来
1)企业生产的用户数据:
 百度指数:http://index.baidu.com/
 阿里指数:http://alizs.taobao.com/
2)数据平台购买数据
 数据堂:https://www.datatang.com/ 
 国云数据市场:http://www.moojnn.com/data-market/
 贵阳大数据交易所:http://trade.gbdex.com/trade.web/index.jsp
3)机构公开的数据
中华人民共和国国家统计局数据:http://data.stats.gov.cn/index.html 
世界银行公开数据:http://data.worldbank.org.cn/ 
联合国数据:http://data.un.org/ 
纳斯达克:http://www.nasdaq.com/zh
4)数据管理咨询公司
麦肯锡:http://www.mckinsey.com.cn/ 
埃森哲:http://www.accenture.com/cn-zh/ 
艾瑞咨询:http://www.iresearch.com.cn/
三.HTTP

1.当输入url之后,按下回车键会发生了什么?
1.当浏览器输入URL,先解析URL地址是否合法.
2.浏览器检查是否存在缓存(浏览器缓存-系统缓存-路由器缓存).
3.若缓存中都不存在,需要进行域名解析(DNS解析),获取对应的IP地址.
4.发起TCP连接,经过三次握手.
5.握手成功,浏览器向服务器发送http请求,发送请求数据包.
6.服务器收到请求后,将数据返回给浏览器.
7.浏览器接收到返回的响应.
8.浏览器解析响应,如果响应可以存入缓存,则存入缓存.
9.浏览器发送请求获取嵌入在html中的资源(html,css,js,图片等)
10.浏览器发送异步请求.
11.页面渲染---全部结束.
2.请求方式:get 和 post
1.GET请求参数是通过URL传递的,POST请求的参数放在请求体中.
2.GET请求比POST请求更不安全,因为参数直接暴露在URL中,所以,GET请求不能用来传递敏感信息.
3.GET请求在url中传递的参数是有长度限制的(在http协议中没有对url的长度进行限制,限制是在特定的浏览器以及服务器对它的限制,不同的浏览器限制的长度不同),POST没有.
4.GET请求参数会完整的保留在浏览器的历史记录中,POST请求的参数不会保留.
5.GET请求进行url编码(百分号编码),POST请求支持多种编码方式.
6.GET请求产生的url地址是可以被bookmark(存书签),post请求不可以.
7.GET请求在浏览器回退的时候是无害的,POST请求会再次提交数据.
8.GET请求在浏览器中可以被主动cache,而POST请求不会,可以手动设置.

深入
1.GET和POST本质上没有区别,都是HTTP协议中的两种发送请求的方法,本质上都是在进行TCP连接.
2.简单地讲:GET产生一个TCP数据包,POST产生两个TCP数据包.
3.复杂的讲:对于GET方式的请求,浏览器会把http header和data一起发送出去,服务器响应200 ok.
对于POST请求,浏览器先发送header,服务器会响应100(已经收到请求的第一部分,正在等待其余部分),浏览器 再次发送data,服务器返回200 ok.

是不是POST请求需要两步,时间上会消耗更多呢?----------不是
1.GET请求和POST请求都有自己的语义,不能够随便混用.
2.在网络环境好的情况下,发送一次包的时间和发送两次包的时间差别可以无视,在网络环境差的情况下,发送两次包的TCP在验证数据完整性上,有非常大的优势.
3.并不是所有的浏览器都会在POST请求中发送两次包.比如:火狐

四.什么是长连接 keep-alive?
1.长连接指在一个连接上可以连接发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包.
2.短连接是指通讯双方有数据交互时,建立的一个连接,数据 发送完成后,则断开此连接,即每次连接只完成一项业务的发送.
3.长连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况.
每个TCP连接都需要三步握手,需要一点时间连接,如果每个操作都是短连接,在操作的话处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发数据包就可以了.

例如:
数据库的连接是长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是资源的浪费.
web网站的http服务一般都用短连接,因为长连接对于服务器来说会耗费一定的资源,web网站这么频繁的上万甚至上亿的客户端连接用短连接会更省一些资源.

五.爬取简单页面
1.百度自定义搜索内容网页的获取
#导入requests
import requests

#请求查询内容
wd=input('请输入一个查询内容:')

#请求参数
params={'wd':wd}

#请求头
headers={
    'User-Agent': '#自己网页上的用户代理'
}

#请求数据
response=requests.get(url='https://www.baidu.com/s',params=params,headers=headers)

#打印请求url
print(response.url)

#保存数据
with open('CSDN.html','w',encoding='utf-8') as fp:
    fp.write(response.text)

出现的问题:
保存的html文件中没有乱码,但是使用浏览器打开乱码了
原因:浏览器的问题,只需要改变浏览器编码即可

2.获取一张小鹿图片
#导入requests模块
import requests
#发起请求
img_response=requests.get(url='https://timgsa.baidu.com/timgimage&quality=80&size=b9999_10000&sec=1605780104598&di=b6a803a90952255cfe2807d7cb622c3a&imgtype=0&src=http%3A%2F%2Fa1.att.hudong.com%2F81%2F71%2F01300000164151121808718718556.jpg')
#保存图片到本地
with open('小鹿.jpg','wb') as fp:
	#获取二进制
    fp.write(img_response.content)
3.获取虎扑新闻的前六页
#导入requests模块
import requests

#虎扑新闻每页的网址
# https://voice.hupu.com/  第一页
# https://voice.hupu.com/news?category=all&page=2  第二页
# https://voice.hupu.com/news?category=all&page=3  第三页
# https://voice.hupu.com/news?category=all&page=4  第三页
.........

#请求头
headers={
    'user-agent': '自己网页上的用户代理'
}

#参数
params={
    'category':'all'
}

#获取前六页内容
for page in range(1,6):
    params['page']=page
    response=requests.get(url='https://voice.hupu.com/news',params=params,headers=headers)
    print(response.url)
    #保存网页内容
    with open(f'ggg{page}.html','w',encoding='utf-8') as fp:
        fp.write(response.text)
4.翻译一个单词
# 导入requests模块
import requests

#异步定义请求头
headers={
    'User-Agent': '自己的网页上的用户代理',
    'x-requested-with':'XMLHttpRequest'
}
kw=input('请输入你要翻译的内容:')
data={
    'kw': kw
}

#发起请求,接收响应
response=requests.post(url='https://fanyi.baidu.com/sug',data=data,headers=headers)

#使用json()可以将json格式的字符串转化成字典
data_list=response.json()['data']
print(type(response.json()))
# #获取数据
for data in data_list:
    #获取单词
    word=data['k']
    explain=data['v']
    print(word,explain)
5.总结

1.url:统一资源定位符
2.一个url只能对应一个网页,一个网页可以由多个url对应
3.在写爬虫的时候,务必要加请求头,至少加User-Agent(用户代理),如果不好用,请求头全部加入,但是以 : 开头的不需要加入.
4.请求头中有’x-requested-with:XMLHttpRequest’代表是异步请求
5.post请求的参数需要使用data传递.
6.ajax加载的数据格式是json格式,就是一个字符串,需要用response.json() 转换为python格式,在进行保存数据

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值