what's the 爬虫?

了解爬虫之前,我们首先要知道什么是互联网

1、什么是互联网?
  互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,总体上像一张网一样。

2、互联网建立的目的?
  互联网的核心价值在于数据的共享和传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。

3、什么是上网?爬虫要做的是什么?
  我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。

只不过,用户获取网络数据的方式是:         浏览器提交请求->下载网页代码->解析/渲染成页面。

而爬虫程序要做的就是:                             模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 

  区别在于:我们的爬虫程序只提取网页代码中对我们有用的数据

4、总结爬虫
  如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据,这就是爬虫。

   爬虫的定义:向网站发起请求,获取资源后分析并提取有用数据的程序

  爬虫的价值:互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。

爬虫的基本流程

1、发起请求
  使用http库向目标站点发起请求,即发送一个Request
  Request包含:请求头、请求体等

2、获取响应内容
  如果服务器能正常响应,则会得到一个Response
  Response包含:html,json,图片,视频等

3、解析内容
  解析html数据:可以利用正则表达式,第三方解析库如Beautifulsoup,pyquery等
  解析json数据:json模块
  解析二进制数据:以b的方式写入文件(图片和视频)

4、保存数据
  数据库、文件

请求与相应

  http协议:参考博客——http://www.cnblogs.com/linhaifeng/articles/8243379.html

  Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)

  Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)

ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。

请求Request

1、请求方式:
  常用的请求方式:GET,POST
  其他请求方式(基本不用):HEAD,PUT,DELETE,OPTHONS

  post与get请求最终都会在url上拼接成这种形式:k1=xxx&k2=yyy&k3=zzz
  post请求的参数放在请求体内,可用浏览器查看,存放于form data内
  get请求的参数直接放在url的?后

2、请求url
  url全称统一资源定位符,如一个网页文档,一张图片,一个视频等都可以用url唯一来确定

  url编码:https://www.baidu.com/s?wd=图片(这时的图片会被编码)

  网页的加载过程是:加载一个网页,通常都是先加载document文档,在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求

3、请求头
  User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户
  host
  cookies:cookie用来保存登录信息

注:一般做爬虫都会加上请求头

4、请求体
  如果是get方式,请求体没有内容
  如果是post方式,请求体是format data

ps:
1、登录窗口,文件上传等,信息都会被附加到请求体内
2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

响应Response

1、主要的响应状态

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求 常见状态码: 200 OK #客户端请求成功
400 Bad Request #客户端请求有语法错误,不能被服务器所理解
401 Unauthorized #请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden #服务器收到请求,但是拒绝提供服务
404 Not Found #请求资源不存在,eg:输入了错误的URL
500 Internal Server Error #服务器发生不可预期的错误
503 Server Unavailable #服务器当前不能处理客户端的请求,一段时间后可能恢复正常

2、Respone header
  set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来

3、preview就是网页源代码
  最主要的部分,包含了请求资源的内容,如网页html,图片,二进制数据等

总结

#1、总结爬虫流程:
爬取--->解析--->存储 #2、爬虫所需工具:
请求库:requests,selenium
解析库:正则,beautifulsoup,pyquery
存储库:文件,MySQL,Mongodb,Redis #3、爬虫常用框架:
scrapy
#
import requests #pip3 install requests
import re
import hashlib
import time
from concurrent.futures import ThreadPoolExecutor pool=ThreadPoolExecutor(50)
movie_path=r'C:\mp4' def get_page(url):
try:
response=requests.get(url)
if response.status_code == 200:
return response.text
except Exception:
pass def parse_index(index_page):
index_page=index_page.result()
urls=re.findall('class="items".*?href="(.*?)"',index_page,re.S)
for detail_url in urls:
if not detail_url.startswith('http'):
detail_url='http://www.xiaohuar.com'+detail_url
pool.submit(get_page,detail_url).add_done_callback(parse_detail) def parse_detail(detail_page):
detail_page=detail_page.result()
l=re.findall('id="media".*?src="(.*?)"',detail_page,re.S)
if l:
movie_url=l[0]
if movie_url.endswith('mp4'):
pool.submit(get_movie,movie_url) def get_movie(url):
try:
response=requests.get(url)
if response.status_code == 200:
m=hashlib.md5()
m.update(str(time.time()).encode('utf-8'))
m.update(url.encode('utf-8'))
filepath='%s\%s.mp4' %(movie_path,m.hexdigest())
with open(filepath,'wb') as f:
f.write(response.content)
print('%s 下载成功' %url)
except Exception:
pass def main():
base_url='http://www.xiaohuar.com/list-3-{page_num}.html'
for i in range(5):
url=base_url.format(page_num=i)
pool.submit(get_page,url).add_done_callback(parse_index) if __name__ == '__main__':
main()
# print(re.findall('\w','hello egon 123'))
# print(re.findall('h.*?src="(.*?)"','he src="(dg)" haaa src="(dssg)" egon 123'))

爬取校花网视频示例(这个网站现在好像不行了。。)

# ####################gif###########
# import requests #pip3 install requests
# import re
# import hashlib
# import time
# from concurrent.futures import ThreadPoolExecutor
#
# pool=ThreadPoolExecutor(50)
# movie_path=r'D:\python代码文件存放目录\S6\1.16\爬虫一 煎蛋\GIF'
#
# def get_page(url):
# try:
# response=requests.get(url)
# if response.status_code == 200:
# return response.text
# except Exception:
# pass
#
# def parse_index(index_page):
# index_page=index_page.result()
# print('111111111',index_page)
# urls=re.findall('style="text-align:center;".*?src="(.*?)"',index_page,re.S)
# print('22222',urls)
# for detail_url in urls:
# # if not detail_url.startswith('http'):
# # detail_url='http://www.xiaohuar.com'+detail_url
# print('-----', detail_url)
# if detail_url.endswith('gif'):
# pool.submit(get_movie,detail_url)
# # pool.submit(get_page,detail_url).add_done_callback(parse_detail)
#
# # def parse_detail(detail_page):
# # detail_page=detail_page.result()
# # print('===',detail_page)
# # l=re.findall('img.*?src="(.*?)"',detail_page,re.S)
# # print(l)
# # if l:
# #
# # movie_url=l[0]
# # if movie_url.endswith('gif'):
# # pool.submit(get_movie,movie_url)
#
# def get_movie(url):
# try:
# response=requests.get(url)
# if response.status_code == 200:
# m=hashlib.md5()
# m.update(str(time.time()).encode('utf-8'))
# m.update(url.encode('utf-8'))
# filepath='%s\%s.gif' %(movie_path,m.hexdigest())
# with open(filepath,'wb') as f:
# f.write(response.content)
# print('%s 下载成功' %url)
# except Exception:
# pass
#
# def main():
# base_url = 'http://www.tufutv.com/news/8.html'
# for i in range(1):
# # url=base_url.format(page_num=i)
# pool.submit(get_page,base_url).add_done_callback(parse_index)
#
# if __name__ == '__main__':
# main() #############煎蛋网##########
import requests #pip3 install requests
import re
import hashlib
import time
import os
from concurrent.futures import ThreadPoolExecutor pool=ThreadPoolExecutor(50)
movie_path=r'D:\python代码文件存放目录\S6\1.16\爬虫一 煎蛋\煎蛋网' def get_page(url,i):
print(i)
try:
response=requests.get(url)
if response.status_code == 200:
return [response.text,i]
except Exception:
pass def parse_index(index_page):
print(index_page,type(index_page))
index_page=index_page.result()
print(index_page, type(index_page))
i = index_page[1]
print(i)
index_page=index_page[0]
# print('111111111',index_page)
urls=re.findall('class="aligncenter".*?src="(.*?)"',index_page,re.S)
print('',urls)
for detail_url in urls:
# if not detail_url.startswith('http'):
# detail_url='http://www.xiaohuar.com'+detail_url
print('-----', detail_url)
if detail_url.endswith('gif'):
a='gif'
elif detail_url.endswith('jpg'):
a = 'jpg'
pool.submit(get_movie,detail_url,a,i)
# pool.submit(get_page,detail_url).add_done_callback(parse_detail) # def parse_detail(detail_page):
# detail_page=detail_page.result()
# print('===',detail_page)
# l=re.findall('img.*?src="(.*?)"',detail_page,re.S)
# print(l)
# if l:
#
# movie_url=l[0]
# if movie_url.endswith('gif'):
# pool.submit(get_movie,movie_url) def get_movie(url,a,i):
print(a,i)
try:
print('try')
response=requests.get(url)
if response.status_code == 200:
print(200)
m=hashlib.md5()
m.update(str(time.time()).encode('utf-8'))
m.update(url.encode('utf-8'))
if not os.path.exists(movie_path + r'\%s'%i):
os.makedirs(movie_path + r'\%s' % i)
filepath='%s\%s\%s.%s' %(movie_path,i,m.hexdigest(),a)
with open(filepath,'wb') as f:
f.write(response.content)
print('%s 下载成功' %url) except Exception :
print(111111111) def main():
base_url = 'http://www.yikeyouzi.com/201604056806/{page_num}'
for i in range(42,43):
url=base_url.format(page_num=i)
pool.submit(get_page,url,i).add_done_callback(parse_index)
time.sleep(3) if __name__ == '__main__':
main()

爬取图片示例(内含福利)

后续知识

  爬虫请求库——requests

  爬虫请求库——selenium

  爬虫解析库——BeautifulSoup

  爬虫解析库——re(正则)

  爬虫最适宜使用的数据库——MongoDB

  如何提升爬虫性能相关的知识点

  终极大招——Scrapy框架

what's the 爬虫之基本原理的更多相关文章

  1. Python爬虫【一】爬虫的基本原理

    一.爬虫基本原理 1.获取网络数据 用户方式:浏览器提交请求->下载网页代码->解析/渲染成页面 爬虫方式:模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放 ...

  2. 爬虫基础---HTTP协议理解、网页的基础知识、爬虫的基本原理

    一.HTTP协议的理解 URL和URI 在学习HTTP之前我们需要了解一下URL.URI(精确的说明某资源的位置以及如果去访问它) URL:Universal Resource Locator 统一资 ...

  3. python网络爬虫进阶之HTTP原理,爬虫的基本原理,Cookies和代理介绍

    目录 一.HTTP基本原理 (一)URI和URL (二)超文本 (三)HTTP和HTTPS (四)HTTP请求过程 (五)请求 1.请求方法 2.请求的网址 3.请求头 4.请求体 (六)响应 1.响 ...

  4. 芝麻HTTP:爬虫的基本原理

    我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛.把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息.可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛 ...

  5. python爬虫知识点总结(二)爬虫的基本原理

    一.什么是爬虫? 答:请求网页并提取数据的自动化程序. 二.爬虫的基本流程 三.什么是Request和Response? 1.Request 2.Response 四.能抓取怎样的数据 五.解析方式 ...

  6. Python爬虫学习==>第六章:爬虫的基本原理

    学习目的: 掌握爬虫相关的基本概念 正式步骤 Step1:什么是爬虫 请求网站并提取数据的自动化程序 Step2:爬虫的基本流程 Step3:Request和Response 1.request 2. ...

  7. PYTHON 爬虫笔记一:爬虫基本原理梳理

    知识点一:爬虫的基本原理梳理 一.什么是爬虫? 请求网站并提取数据的自动化程序 二.爬虫的基本流程 1:向服务器发起请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的 ...

  8. [Python3网络爬虫开发实战] 2.1-HTTP基本原理

    在本节中,我们会详细了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么.了解了这些内容,有助于我们进一步了解爬虫的基本原理. 1. URI和URL 这里我们先了解一下URI和 ...

  9. 放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~)

    放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wa ...

随机推荐

  1. ElasticSearch在linux上的安装部署全程记录

    由于项目需求,需要在linux平台搭建一套ES服务.在搭建过程中,遇到各种各样的问题.后来都一一解决.现在要记录下来这个过程,以及其中遇到的问题,及其解决方法. 一.环境配置 操作系统:Cent OS ...

  2. [Artoolkit] ARSimpleNativeCarsProj for Multi Markers Tracking

    效果简直了,但代码架构有点坑,慢慢道来. libc++_shared.so应该是c++的库:libARWrapperNativeCaresExample.so也有对应的c++文件:那么,libARWr ...

  3. sklearn参数优化方法

    学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的 ...

  4. findpanel 的相关代码

    https://blog.csdn.net/zengcong2013/article/details/43118189 In addition to this method, you can use ...

  5. Get Started with the Google Fonts API

    Get Started with the Google Fonts API This guide explains how to use the Google Fonts API to add fon ...

  6. POJ 1958 Strange Towers of Hanoi

    Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3784 Accepted: 23 ...

  7. php 逗号 explode分割字符串 或 implode组装成字符串

    php 逗号 分割字符串 介绍两个函数给你 <?php //利用 explode 函数分割字符串到数组 $source = "hello1,hello2,hello3,hello4,h ...

  8. 掌握业界最新工程实践 | 了解AIOps下一代微服务等最新趋势

    近年来,IT应用越来越复杂,一旦出现故障,诊断越来越困难,使用传统技术来管理机器数据的组织会让其运维团队不堪重负.幸好随着大数据.机器学习和AI技术的飞速发展,智能化运维给这一现状带来了改变. 那么就 ...

  9. [No000018C]Vim清除上次的搜索高亮结果-Vim使用技巧(1)

    在打开文件中使用Vim搜索功能并开启高亮显示后怎么取消当前高亮显示的目标词? 最简单的方法是再使用Vim搜索一串文档中不存在的目标词来覆盖当前高亮的搜索结果. 其实,可以在Vim尾行模式下使用 :no ...

  10. href='#' 和 href='###'

    如果想定义一个空的链接,又不跳转到页面头部,可以写href="###". 详细解释就是'#' 是有特定意义的,如果 '#' 后有内容会被认为是一个标签而从页面找到相应标签跳转到该处 ...