QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 2243|回复: 0

[Python] 三个Python爬虫版本,各种方式爬取校花网美图

[复制链接]

等级头衔

积分成就    金币 : 2806
   泡泡 : 1516
   精华 : 6
   在线时间 : 1244 小时
   最后登录 : 2024-5-5

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-6-2 11:09:40 | 显示全部楼层 |阅读模式
一、爬虫是什么?- z" e5 @! |' r5 }
       如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序;从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用。* ?0 }+ y; [& t, O
二、基本环境配置" y% V3 X4 J. x( c( @
  • 版本:Python3
  • 系统:Windows
  • IDE:Pycharm; p# p/ R8 h% _9 @
三、爬虫所需工具:/ J/ F& u' `5 x0 g3 t
  • 请求库:requests,selenium(可以驱动浏览器解析渲染CSS和JS,但有性能劣势(有用没用的网页都会加载);)
  • 解析库:正则,beautifulsoup,pyquery
  • 存储库:文件,MySQL,Mongodb,Redis
    - }, b1 L9 U& P
四、Python爬虫基本流程  b1 S3 m( B3 D/ ~
1.jpg 8 e0 @/ o+ o: ]+ h0 ^
基础版:8 R( u' M% H2 ~5 @3 ]
  1. import re
  2. import requests
  3. respose = requests.get ('http://www.xiaohuar.com/v/')
  4. # print(respose.status_code) #响应的状态码
  5. # print(respose.content) #返回字节信息
  6. # print(respose.text)  #返回文本内容
  7. urls=re.findall(r'class="items".*?href="(.*?)"',respose.text,re.S) #re.s 把文本信息转换成1行匹配
  8. url=urls[5]
  9. result=requests.get(url)
  10. mp4_url=re.findall(r'id="media".*?src="(.*?)"',result.text,re.s)[0]
  11. video=requests.get(mp4_url)
  12. with open('D:\\a.mp4,'wb') as f:
  13.     f.write(video.content)
函数封装版:- r/ c. K/ Y* |! u
  1. import re
  2. import requests
  3. import hashlib
  4. import time
  5. def get_index(url):
  6.     respose = requests.get(url)
  7.     if respose.status_code==200:
  8.         return respose . text
  9. def parse_index(res):
  10.     urls = re.findall(r'class="itens".*?href="(.*?)"',res,re.S) # re.S 把文本信息转换成1行匹配
  11.     return urls
  12. def get_detail(urls):
  13.     For url in urls
  14.         if not url.startswith('http'):
  15.             url='http://www.xiaohuar.com%s' %url
  16.         result = requests.get(url)
  17.         if result.status_code = 200 :
  18.             mp4_url_list = re.findall(r'id="media".*?src="(.*?)"',result.text,re.S)
  19.             if mp4_url_list:
  20.                 mp4_url=mp4_url_list[0]
  21.                 print(mp4_url)
  22.                 # save mp4_url)
  23.                
  24. def save(url):
  25.     video = requests.get(url)
  26.     if video.status_code==200:
  27.         m=hashlib.md5()
  28.         m.updata(url.encode('utf-8'))
  29.         m.updata(str(time.time()).encode('utf-8')
  30.         filename=r'%s.mp4'% m.hexdigest()
  31.         filepath=r'D:\\%s'%filename
  32.         with open(filepath,'wb') as f:
  33.             f.write(video.content)
  34.             
  35. def main():
  36.     for i in range(5):
  37.         res1 = get_index('http://www.xiaohuar.com/list-3-%s.html'% i )
  38.         res2 = parse_index(res1)
  39.         get_detail(res2)
  40. if __name__ == '__main__':
  41.     main()
并发版3 s  L$ q: D2 e/ C- X/ y8 c
(如果一共需要爬30个视频,开30个线程去做,花的时间就是其中最慢那份的耗时时间)
8 |; A$ `$ ?8 M% |# V1 H# s+ |
  1. import re
  2. import requests
  3. import hashlib
  4. import time
  5. from concurrent.futures import ThreadPoolExecutor
  6. p=ThreadPoolExecutor(30)  #创建1个程池中,容纳线程个数为30个;
  7. def get_index(url):
  8.     respose = requests.get(url)
  9.     if respose.status_code==200:
  10.         respose.text
  11. def parse_index(res):
  12.     res=res.result() #进程执行完毕后,得到1个对象
  13.     urls = re.findall(r'class="items".*?href="(.*?)"',res,re.S) #re.s 把文本信息转换成1行匹配
  14.     for url in urls:
  15.         p.submit(get_detail(url)) #获取详情页 提交到线程池
  16.         
  17. def get_detail(url): #只下载1个视频
  18.         if not url.startswith('http'):
  19.             url='http://www.xiaohuar.com%s' %url
  20.         result = requests.get(url)
  21.         if result.status_code==200 :
  22.             mp4_url_.findall(r'id="media".*?src="(.*?)"',result.text,re.S)
  23.             if mp4_url_list:
  24.                 mp4_url=mp4_url_list[0]
  25.                 print(mp4_url)
  26.                 # save(mp4_url)
  27.                
  28. def save(url):
  29.     video = requests.get(url)
  30.     if video.status_code==200:
  31.         m=hashlib.md5()
  32.         m.updata(url.encode('utf-8'))
  33.         m.updata(str(time.time()).encode('utf-8'))
  34.         filename=r'%s.mp4'% m.hexdigest()
  35.         filepath=r'D:\\%s'%filename
  36.         with open(filepath,'wb') as f:
  37.             f.write(video.content)
  38.             
  39. def main():
  40.     for i in range(5):
  41.         p.submit(get_index,'http://www.xiaohuar.com/list-3-%s.html'% i ).add_done_callback(parse_index)
  42.         #1、先把爬 大牧人任务(get_index)异步提交到线程池
  43.         #2、get_index任务执行完后,会通过回调add_done_callback()通知主线程,任务完成
  44.         #3、把get_index执行结果(注意线程执行结果是对象,调用res=res.result()方法,才能获取真正执行结果),当做参数传给parse_index
  45.         #4、通过循环,再次把获取详情页get_detail()任务提交到线程池执行
  46. if  __name__ == '__main__':
  47.     main()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-10 15:10

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表