概述

本次爬虫任务是爬取图片网站图片,网址是https://www.vmgirls.com/


分析网页

第一步,打开需要爬取的页面https://www.vmgirls.com/13344.html

打开F12,随便选择一张图片查看图片,操作如下

第二步,寻找所需下载图片的地址,并分析最优的方式

第三步,得出结论,可以通过获取每张图片的url地址,进行保存图片的动作


代码操作

请求网页

第一步,我们请求网页并打印网页返回的请求

  1. import requests
  2. '''请求网页'''
  3. response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
  4. print(response.text)

发现出现403 Forbidden,我们需要寻找原因

  1. # <html>
  2. # <head><title>403 Forbidden</title></head>
  3. # <body>
  4. # <center><h1>403 Forbidden</h1></center>
  5. # <hr><center>Her</center>
  6. # </body>
  7. # </html>

我们插入一个代码

  1. print(response.request.headers)

发现问题所在,网页返回的信息中表示,我们发送的请求来源于一个爬虫程序,所以我们需要伪装一个header,

  1. # {'User-Agent': 'python-requests/2.23.0',
  2. # 'Accept-Encoding': 'gzip, deflate',
  3. # 'Accept': '*/*',
  4. # 'Connection': 'keep-alive'}

怎么做,打开浏览器,指定网页,F12查看浏览器发送的headers

复制heades到代码中

  1. import requests
  2. '''请求网页'''
  3. headers = {
  4. 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
  5. }
  6.  
  7. response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
  8. print(response.text)
  9. print(response.request.headers)

能够正常得到网页返回的信息了


解析网页

解析网页本次使用正则表达式

导入re库

  1. import re
  2.  
  3. urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
  4. print(urls)

得到5个图片的url链接

['https://static.vmgirls.com/image/2019/12/2019122210292813-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210295639-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210300913-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210301954-scaled.jpeg']


保存图片

将所有的图片保存为文件格式

  1. for url in urls:
  2. response = requests.get(url, headers=headers)
  3. # 将url中后面的数字字段截取出来作为图片的文件名
  4. file_name = url.split('/')[-1]
  5. # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  6. with open(file_name,'wb') as f:
  7. # 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
  8. f.write(response.content)

此时需要考虑到两个问题

1.访问频次

2.文件应该需要保存在但个文件夹中,问不是散乱的存放

修改代码如下

  1. import os
    # 获得文件夹名
  2. dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1]
  3. # 判断文件夹是否存在,并创建文件夹
  4. if not os.path.exists(dir_name):
  5. os.makedirs(dir_name)
  6. # 遍历所有的url,将所有的url单独保存
  7. for url in urls:
  8.  
  9. # 放置访问频次太高,设置访问频率,需要导入time模块
  10. time.sleep(1)
  11. response = requests.get(url, headers=headers)
  12. # 将url中后面的数字字段截取出来作为图片的文件名
  13. file_name = url.split('/')[-1]
  14.  
  15. # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  16. # 由于加入了文件夹的步骤,所以with open(file_path,wb)as f中file_path需要带上文件夹
  17. # with open(file_name,'wb') as f:
  18. with open(dir_name+'/'+file_name, 'wb') as f:
  19. # 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
  20. f.write(response.content)
  21.  
  22. # 由于这种方式文件是一个个单独的存放在目录下面,并没有较好的分类,我们需要加入一个分类的步骤
  23. # 根据网页中的名称设置文件夹名为dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1]
  24. # 若想创建文件夹,需要导入os库
  25. # 判断文件夹是否存在

任务完成

完整代码

  1. import requests
  2. import re
  3. import time
  4. import os
  5.  
  6. '''请求网页'''
  7.  
  8. headers = {
  9. 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
  10. }
  11.  
  12. response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
  13. html = response.text
  14.  
  15. """
  16. print(response.text)
  17.  
  18. # <html>
  19. # <head><title>403 Forbidden</title></head>
  20. # <body>
  21. # <center><h1>403 Forbidden</h1></center>
  22. # <hr><center>Her</center>
  23. # </body>
  24. # </html>
  25.  
  26. # 发现了403 Forbidden,也就是这个系统设置了反爬虫,所以需要改变
  27. # 我们查看一下返回的headers,也就是请求的头信息
  28.  
  29. print(response.request.headers)
  30.  
  31. # {'User-Agent': 'python-requests/2.23.0',
  32. # 'Accept-Encoding': 'gzip, deflate',
  33. # 'Accept': '*/*',
  34. # 'Connection': 'keep-alive'}
  35.  
  36. # 发现这是用python端请求,理所当然的被网页拒绝了,所以我们需要一个伪装的headers,伪装成浏览器发送的请求
  37. # 怎么做,打开浏览器,指定网页,F12查看浏览器发送的headers
  38. # {user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36}
  39.  
  40. # 制作伪装的headers
  41. # headers = {'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
  42. # 注意headers是一个字典,不是字符串,所以格式为"user-agent":"头部具体信息"
  43.  
  44. # 将headers放置到网页请求的前面,即response前
  45. # 同时response里面带上headers
  46. # 程序运行之后发现可以正常运行
  47.  
  48. """
  49.  
  50. '''解析网页'''
  51.  
  52. # 解析网页本次使用正则表达式
  53. # 导入re库
  54.  
  55. # 获得文件夹名
  56. dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1]
  57. # 判断文件夹是否存在,并创建文件夹
  58. if not os.path.exists(dir_name):
  59. os.makedirs(dir_name)
  60.  
  61. # 获得所有图片的url链接
  62. urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
  63. print(urls)
  64.  
  65. """保存图片"""
  66.  
  67. # 遍历所有的url,将所有的url单独保存
  68. for url in urls:
  69.  
  70. # 放置访问频次太高,设置访问频率,需要导入time模块
  71. time.sleep(1)
  72. response = requests.get(url, headers=headers)
  73. # 将url中后面的数字字段截取出来作为图片的文件名
  74. file_name = url.split('/')[-1]
  75.  
  76. # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  77. # 由于加入了文件夹的步骤,所以with open(file_path,wb)as f中file_path需要带上文件夹
  78. # with open(file_name,'wb') as f:
  79. with open(dir_name+'/'+file_name, 'wb') as f:
  80. # 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
  81. f.write(response.content)
  82.  
  83. # 由于这种方式文件是一个个单独的存放在目录下面,并没有较好的分类,我们需要加入一个分类的步骤
  84. # 根据网页中的名称设置文件夹名为dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1]
  85. # 若想创建文件夹,需要导入os库
  86. # 判断文件夹是否存在

图片结果

python爬虫-vmgirls-正则表达式的更多相关文章

  1. 玩转python爬虫之正则表达式

    玩转python爬虫之正则表达式 这篇文章主要介绍了python爬虫的正则表达式,正则表达式在Python爬虫是必不可少的神兵利器,本文整理了Python中的正则表达式的相关内容,感兴趣的小伙伴们可以 ...

  2. 【Python爬虫】正则表达式与re模块

    正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...

  3. python 爬虫之-- 正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 正则表达式非python独有,python 提供了正则表达式的接口,re模块 一.正则匹配字符简介 模式 描述 \d ...

  4. python爬虫训练——正则表达式+BeautifulSoup爬图片

    这次练习爬 传送门 这贴吧里的美食图片. 如果通过img标签和class属性的话,用BeautifulSoup能很简单的解决,但是这次用一下正则表达式,我这也是参考了该博主的博文:传送门 所有图片的s ...

  5. 【python爬虫和正则表达式】爬取表格中的的二级链接

    开始进公司实习的一个任务是整理一个网页页面上二级链接的内容整理到EXCEL中,这项工作把我头都搞大了,整理了好几天,实习生就是端茶送水的.前段时间学了爬虫,于是我想能不能用python写一个爬虫一个个 ...

  6. Python爬虫运用正则表达式

    我看到最近几部电影很火,查了一下猫眼电影上的数据,发现还有个榜单,里面有各种经典和热映电影的排行榜,然后我觉得电影封面图还挺好看的,想着一张一张下载真是费时费力,于是突发奇想,好像可以用一下最近学的东 ...

  7. Python爬虫之正则表达式(3)

    # re.sub # 替换字符串中每一个匹配的子串后返回替换后的字符串 import re content = 'Extra strings Hello 1234567 World_This is a ...

  8. Python爬虫之正则表达式(1)

    廖雪峰正则表达式学习笔记 1:用\d可以匹配一个数字:用\w可以匹配一个字母或数字: '00\d' 可以匹配‘007’,但是无法匹配‘00A’; ‘\d\d\d’可以匹配‘010’: ‘\w\w\d’ ...

  9. python爬虫之正则表达式

    一.简介 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念 ...

  10. Python爬虫基础——正则表达式

    说到爬虫,不可避免的会牵涉到正则表达式. 因为你需要清晰地知道你需要爬取什么信息?它们有什么共同点?可以怎么去表示它们? 而这些,都需要我们熟悉正则表达,才能更好地去提取. 先简单复习一下各表达式所代 ...

随机推荐

  1. java-锁膨胀的过程

    先来看个奇怪的demo public class A { int i=0; // boolean flag =false; public synchronized void parse(){ i++; ...

  2. PHP文件包含漏洞(利用phpinfo)复现

    0x01 简介 PHP文件包含漏洞中,如果找不到可以包含的文件,我们可以通过包含临时文件的方法来getshell.因为临时文件名是随机的,如果目标网站上存在phpinfo,则可以通过phpinfo来获 ...

  3. redis: Zset有序集合类型(七)

    存值:zadd myset 1 one 取值:zrange myset 0 -1 127.0.0.1:6379> zadd myset 1 one #存值 分值为1 (integer) 1 12 ...

  4. Spring5:控制反转

    二.Spring IOC控制反转 1:IOC推导 >传统业务调用编程 定义一个userDao接口:UserDao package com.spring; public interface Use ...

  5. 使用hexo和coding建立静态博客站点

    背景 由于工作性质的原因,做技术的总想记录和分享一下自己的学习和成长历程,向这世界证明我来过.写文章,发博客,一开始使用51cto,广告太多,看起来让人很痛苦:接着试用了博客园,广告少一些,但感觉还是 ...

  6. ThreadLocal 是什么鬼?用法、源码一锅端

    ThreadLocal 是一个老生常谈的问题,在源码学习以及实际项目研发中,往往都能见到它的踪影,用途比较广泛,所以有必要深入一番. 敢问,ThreadLocal 都用到了哪里?有没有运用它去解决过业 ...

  7. mysql5.7免安装版配置

    解压之后,新建一个my.ini 内容是: [mysql] # 设置mysql客户端默认字符集 default-character-set = utf8 [mysqld] #安装目录 basedir = ...

  8. java学习(第三篇)String类

    一.创建一个字符串 1.String(char a[]):用一个字符数组a创建一个string类型 char a[]= {'h','e','l','l','o'}; String s=new Stri ...

  9. Linux 获取网卡名字列表

    lspci | egrep -i --color 'network|ethernet'

  10. openssl查看证书细节 [转载]

    openssl x509部分命令 打印出证书的内容: openssl x509 -in cert.pem -noout -text 打印出证书的系列号 openssl x509 -in cert.pe ...