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()