zoukankan      html  css  js  c++  java
  • 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()
    单页操作
  • 相关阅读:
    C++ UNREFERENCED_PARAMETER函数的作用
    Win32 Console Application、Win32 Application、MFC三者之间的联系和区别
    解决CSDN博客插入代码出现的问题
    C++ std::vector指定位置插入
    计算机如何与人沟通(1)
    C++ fstream文件操作
    using namespace std 和 include 的区别
    找不到windows.h源文件
    C++ 字符串转换
    WPF style 换肤
  • 原文地址:https://www.cnblogs.com/herosyuan/p/10242233.html
Copyright © 2011-2022 走看看