pycharm 爬取校花网

  1 1:什么是爬虫
  2     定义:狭义:模拟浏览器,浏览网页,保存数据的程序
  3     定义:广义:自动下载网络数据(网页,游戏,qq)的程序
  4     打开校花网 ‘www.xiaohuar.com/hua/’    #直接爬取影响课堂秩序
  5         如果 你不会写爬虫,你老板让你下载校花网的一千张图片,用了一整天,你只能另存为。那么,可能你一天过后就被T了
  6     
  7     分析:
  8             web原理:
  9                 c/s   client,server
 10                 浏览器
 11                 服务器(server)
 12                 浏览器要获取一个网页,首先他要获取一个网址(url:统一资源定位符)。
 13                 浏览器获取到url之后,会向服务器发送一个http(网络传输协议的一种)请求
 14                 服务器会对这个请求进行处理,将处理结果返回(请求【文档,图片,视屏】,就返回相应的【文档,图片,视屏】)  #http响应
 15                 浏览器根据返回的数据,进行不同的渲染,展示给用户
 16                 基于socket    
 17 2:写一个爬虫的步骤:
 18     1.下载数据    #先下载一张
 19         1.frist_url = 'http://www.xiaohuar.com/hua/'
 20         分析网页的加载流程
 21             分类
 22                 直接的,未处理的
 23                 带参数验证
 24                 cookie验证
 25                 登录验证
 26                 js加密
 27             工具:
 28             google,火狐
 29             f12
 30             看源码
 31             选取存储地址,鼠标右键    open in new tab,复制网址链接‘http://www.xiaohuar.com/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg’
 32             先测试一下
 33             pycharm:
 34                 from urllib impor request   #通过这个就可以发送请求了
 35                 url = ‘http://www.xiaohuar.com/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg’
 36                 #request.urlopen(url)
 37                 response = request.urlopen(url) #用一个变量来接收
 38                 print(respomse)   #显示了一个http respomse 的对象,不是我们想要的
 39                 print(respomse.read())   #以‘b’开头的叫字节,就是二进制数据
 40                 
 41                 
 42                 #保存图片:把图片的的信息放进文件里(把大象放进冰箱需要几步)
 43                     f = open('1.jpg','wb')     #指明以二进制的模式打开,只能写入二进制数
 44                     f.write(respomse.read())
 45                     f.close()
 46                     #如果报错,因为read读取过后,把下标移到了末尾,把上面print(respomse.read())注释掉
 47                         简化一下:   #不需要我们去close了
 48                                 with open(filename,'wb') as f:
 49                                     f.write(request.urlopen(url).read())   
 50    
 51             
 52     2.分析提取有用的数据
 53         获取其他图片url
 54         开始获取所有图片:
 55             url = 'http://www.xiaohuar.com/hua/'   #url = 首页
 56             response = request.urlopen(url) #用一个变量来接收
 57                 #print(respomse)   #显示了一个http respomse 的对象,不是我们想要的
 58                 #print(response.read()) #以‘b’开头的叫字节,就是二进制数据(字节)
 59                 #print(response.read().decode('GBK'))   #转码,变成文本,加上一个字符编码#成功的获得了文档形式的网页源码
 60             改写成一句:
 61             html = 'request.urlopen(url).read().decode('GBK')'   #现在,html就是我们的页面信息
 62                             
 63         需要拿到地址的字符串:
 64         网页源代码,查找img
 65             使用正则,通过一定的规律,在文档里面来匹配符合规则的字符,获取出来
 66             import url
 67             复制几个地址过来,用来匹配
 68             #/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg
 69             #/d/file/20180907/075025972927c8e7541b09e272afe5cc.jpg
 70             img_urls = re.findall(r'/d/file/\d+/\w+\.jpg',html)   #找规律  \d匹配数字 \w可以匹配字母和数字的组合,+代表多个
 71             #print(len(img_urls,img_urls[0]))            #打印操作,打印匹配出多少个,匹配出来的第一个的值
 72             》》》/d/file/20181216/9df718a54adae448c65f54246a581a19.jpg     #这个url有什么问题?没有域名
 73             img_urls = ('http://www.xiaohuar.com %s' % url for url in img_urls)    #补全操作,给他添加域名  #python先计算右边,再赋值给左边
 74             #现在,会报错,因为用了for 循环,他是一个生成器,不能使用len方法,想要查看,使用for循环img_urls,打印url
 75         #现在下载图片
 76         #用url的最后一节做名字
 77             for url in img_urls:
 78                 filename = url.split('/')[-1]      #以‘/’切片,分割之后获得一个列表,获取最后一个【-1】
 79                 #print(filename)
 80                 with open(filename,'wb') as f:
 81                     f.write(request.urlopen(url).read()) 
 82                 print(url)   #好看
 83         #多页操作
 84             点击第二页,复制url(http://www.xiaohuar.com/list-1-1.html)
 85             点击三页,复制url(http://www.xiaohuar.com/list-1-2.html)
 86             以此类推
 87             添加到文章开头url = 'http://www.xiaohuar.com/hua/'下面
 88             写最简单的方法:  
 89                 urls = ['http://www.xiaohuar.com/hua/',   #依次改一下
 90                 http://www.xiaohuar.com/list-1-1.html
 91                 http://www.xiaohuar.com/list-1-2.html
 92                 http://www.xiaohuar.com/list-1-3.html
 93                 http://www.xiaohuar.com/list-1-4.html
 94                 http://www.xiaohuar.com/list-1-5.html
 95                 ]
 96             for url in urls:    
 97                 '把刚才的代码缩进进去'
 98             
 99             很容易报错,因为没有做任何的处理,urlopen(url)如果时间超时了,或者404没有找到,就会报错
100             
101             代码不规范,全部都是面向过程写的,也没有异常处理
102                 
103                 
104     3.保存数据
105         
106         
理论知识

 

 1 from urllib import request
 2 import re
 3 url = 'http://www.xiaohuar.com/hua/'
 4 html = request.urlopen(url).read().decode('GBK')
 5 img_url =re.findall(r'/d/file/\d+/\w+\.jpg',html)
 6 for url in img_url:
 7     img_urls = 'http://www.xiaohuar.com%s ' %url
 8     filename = img_urls.split('/')[-1]
 9     with open(filename,'wb') as f :
10         f.write(request.urlopen(img_urls).read())
11         print()
单页操作

猜你喜欢

转载自www.cnblogs.com/herosyuan/p/10242233.html