爬⾍基本原理
⼀、爬⾍是什么?
#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协议:wwwblogs/haiyan123/p/7298967.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编码
www.baidu/s?wd=图⽚
图⽚会被编码(看⽰例代码)
⽹页的加载过程是:
加载⼀个⽹页,通常都是先加载document⽂档,
营业执照怎么在网上注册在解析document⽂档的时候,遇到链接,则针对超链接发起下载图⽚的请求
#3、请求头
User-agent:告诉它这是浏览器发过来的请求(请求头中如果没有user-agent客户端配置,服务端可能将你当做⼀个⾮法⽤户)务必加上
host
cookies:cookie⽤来保存登录信息
Referer:上⼀次的跳转路径
⼀般做爬⾍都会加上请求头
#4、请求体
如果是get⽅式,请求体没有内容
如果是post⽅式,请求体是format data
ps:
1、登录窗⼝,⽂件上传等,信息都会被附加到请求体内
2、登录,输⼊错误的⽤户名密码,然后提交,就可以看到post,正确登录后页⾯通常会跳转,⽆法捕捉到post
1import requests
2from urllib.parse import urlencode
3# 请求⽅式
4 kwords = input("请输⼊关键字:>>").strip()
5 res = urlencode({"wd":kwords}) # # 请求的url,当你在百度输⼊中⽂的时候,你把url拿下来会变成下⾯的这样格式的url,所以得urlencode⼀下
6 url ="www.baidu/s?"+res #www.baidu/s?wd=%E5%9B%BE%E7%89%87
7
8 response = (
9# 请求的url,当你在百度输⼊中⽂的时候,你把url拿下来会变成下⾯的这样格式的url
10 url,
11# 请求头
12 headers={
13"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
14 },
15 )
16 with open("a.html","w",encoding="utf-8") as f:
17 f.)
18# print(response.status_code)
⽰例代码1
1 kwords = input("请输⼊关键字:>>").strip()
2 response = (
3"www.baidu/s?",
4# 请求的url,当你在百度输⼊中⽂的时候,你把url拿下来会变成下⾯的这样格式的url
5 params={
6"wd":kwords,
7'pn':20
8 },
9# 请求头
10 headers={
11"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36", 12 },
13 )
14 with open("b.html","w",encoding="utf-8") as f:
15 f.)
16# print(response.status_code)
⽰例代码⼆(和上⾯的结果是⼀样的)
五、Response
#1、响应状态
200:代表成功
301:代表跳转
404:⽂件不存在
403:权限
502:服务器错误
#2、Respone header
Location:跳转
set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来#3、preview就是⽹页源代码
最主要的部分,包含了请求资源的内容
如⽹页html,图⽚
⼆进制数据等
六、总结
#1、总结爬⾍流程:
爬取--->解析--->存储
#2、爬⾍所需⼯具:
请求库:requests,selenium
解析库:正则,beautifulsoup,pyquery
存储库:⽂件,MySQL,Mongodb,Redis
#3、爬⾍常⽤框架:
scrapy
1import requests #pip3 install requests
2import re
3import hashlib
4import time
5
6 movie_path=r'C:\mp4'
7
8def get_page(url):
9try:
10 (url)
11if response.status_code == 200:
13except Exception:
14pass
15
16def parse_index(index_page):
17 urls=re.findall('class="items".*?href="(.*?)"',index_page,re.S) 18for url in urls:
心情说说短句 随心19if not url.startswith('http'):
20 url='www.xiaohuar'+url
21yield url
22
23def parse_detail(detail_page):
24 l=re.findall('id="media".*?src="(.*?)"',detail_page,re.S)
25if l:
26 movie_url=l[0]
27if dswith('mp4'):
28yield movie_url
29
30def get_movie(url):
31try:
32 (url)
33if response.status_code == 200:
34 m=hashlib.md5()
35 m.update(str(time.time()).encode('utf-8'))
36 m.de('utf-8'))
37 filepath='%s\%s.mp4' %(movie_path,m.hexdigest())动漫爱情
38 with open(filepath,'wb') as f:
39 f.t)
40print('%s 下载成功' %url)
41except Exception:
42pass
43
44def main():
45 base_url='www.xiaohuar/list-3-{page_num}.html' 46for i in range(5):
47 url=base_url.format(page_num=i)
48 index_page=get_page(url)
49 detail_urls=parse_index(index_page)
50for detail_url in detail_urls:
51 detail_page=get_page(detail_url)
52 movie_urls=parse_detail(detail_page)
53for movie_url in movie_urls:
54 get_movie(movie_url)
55
56if__name__ == '__main__':
57 main()
爬取校花⽹视频⽰例⼀
1import requests #pip3 install requests
2import re
3import hashlib
4import time
5from concurrent.futures import ThreadPoolExecutor
6
7 pool=ThreadPoolExecutor(50)
8 movie_path=r'C:\mp4'
9
10def get_page(url):
11try:
12 (url)
13if response.status_code == 200:
15except Exception:如何装修房子
16pass
17
18def parse_index(index_page):
19 index_page=sult()
20 urls=re.findall('class="items".*?href="(.*?)"',index_page,re.S)
21for detail_url in urls:
22if not detail_url.startswith('http'):
23 detail_url='www.xiaohuar'+detail_url
24 pool.submit(get_page,detail_url).add_done_callback(parse_detail) 25
26def parse_detail(detail_page):
27 detail_page=sult()
28 l=re.findall('id="media".*?src="(.*?)"',detail_page,re.S)
29if l:
30 movie_url=l[0]
31if dswith('mp4'):
32 pool.submit(get_movie,movie_url)
33
34def get_movie(url):
35try:
36 (url)预祝2021高考顺利的话
37if response.status_code == 200:
38 m=hashlib.md5()
39 m.update(str(time.time()).encode('utf-8'))
40 m.de('utf-8'))
41 filepath='%s\%s.mp4' %(movie_path,m.hexdigest())
42 with open(filepath,'wb') as f:
43 f.t)
44print('%s 下载成功' %url)
45except Exception:
46pass
47
48def main():
49 base_url='www.xiaohuar/list-3-{page_num}.html'
50for i in range(5):
51 url=base_url.format(page_num=i)
幽默的qq个性签名52 pool.submit(get_page,url).add_done_callback(parse_index)
53
54if__name__ == '__main__':
55 main()
爬取校花⽹视频⽰例⼆(加了并发的)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论