爬虫原理
一、爬虫是什么?
#1、什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。 #2、互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目
的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。 #3、什么是上网?爬虫要做的是什么? 我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 #3.1 只不过,用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面。 #3.2 而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 #3.1与3.2的区别在于: 我们的爬虫程序只提取网页代码中对我们有用的数据 #4、总结爬虫 #4.1 爬虫的比喻: 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程
序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据 #4.2 爬虫的定义: 向网站发起请求,获取资源后分析并提取有用数据的程序 #4.3 爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息
等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个
行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地
挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为
你提供有价值的数据。
二、爬虫的基本流程

#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
ps:用浏览器演示get与post的区别,(用登录演示post)
post与get请求最终都会拼接成这种形式: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
from urllib.parse import urlencode # params={ # 'wd':'时间' # } # url='https://www.baidu.com/s?%s'%urlencode(params,encoding="utf-8") # # # print(url) # # response=requests.get(url, # headers={ # "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" # },) # # print(response.status_code) # print(response.text) # # with open('text.html','w',encoding='utf-8') as f: # f.write(response.text) # num=1 # response=requests.get('https://www.baidu.com/s?', # params={ # 'wd':'时间', # 'pn':num # }, # headers={ # "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", # },) # # print(response.status_code) # print(response.text) # # with open('text1.html','wb') as f: # f.write(response.content) # #params内部就是调用urlencode
五、Response
#1、响应状态
200:代表成功
301:代表跳转
404:文件不存在
403:权限
502:服务器错误
#2、Respone header
set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来
#3、preview就是网页源代码
最主要的部分,包含了请求资源的内容
如网页html,图片
二进制数据等
#1、总结爬虫流程: 爬取--->解析--->存储 #2、爬虫所需工具: 请求库:requests,selenium 解析库:正则,beautifulsoup,pyquery 存储库:文件,MySQL,Mongodb,Redis #3、爬虫常用框架: scrapy
import requests import re import hashlib,time,os from concurrent.futures import ThreadPoolExecutor pool=ThreadPoolExecutor(50) DOWLOAD_PATH=r'E:\DOWLOAD_PATH' def get_page(url): try: reponse=requests.get(url) if reponse.status_code==200: return reponse.text except Exception:pass # 请求详情页,解析拿到视频的链接地址 def parse_index(index_contents): index_contents=index_contents.result() # print(index_contents) detail_urls = re.findall('class="items".*?href="(.*?)"', index_contents, re.S) for detail_url in detail_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_contents): detail_contents=detail_contents.result() movie_urls=re.findall('id="media".*?src="(.*?)"',detail_contents,re.S) if movie_urls: movie_url=movie_urls[0] if movie_url.endswith('mp4'): pool.submit(download,movie_url) # 下载视频 def download(movie_url): try: response=requests.get(movie_url) if response.status_code==200: data=response.content m=hashlib.md5() m.update(str(time.time()).encode("utf-8")) m.update(movie_url.encode("utf-8")) filepath=os.path.join(DOWLOAD_PATH,'%s.mp4'%m.hexdigest()) with open(filepath,'wb') as f: f.write(data) f.flush() print("下载成功",movie_url) except Exception: pass def main(): raw_url='http://www.xiaohuar.com/list-3-{page_num}.html' for i in range(5): # 请求索引页,解析拿到详情页链接 index_url=raw_url.format(page_num=i) pool.submit(get_page,index_url).add_done_callback(parse_index) if __name__=='__main__': main()

浙公网安备 33010602011771号