requests爬取唯美女孩图片

  • 一、前言
  • 二、实现项目
    • 1.分析网页
    • 2.爬取网页
      • 2-1、模拟POST请求
      • 2-2、解析图集列表页面
      • 2-2、解析图集页面
      • 2-3、保存图片
      • 2-4、执行爬虫
    • 3.爬取结果
  • 三、完整代码:
  • 四、总结

一、前言

最近学习爬虫,都是跟着教程做的,如今想摆脱教程,独立完成一个爬虫小项目,故作此文,总结项目过程中遇到的问题和解决方法。

二、实现项目

1.分析网页

首先打开目标网站,本次项目以 唯美女生 | 一双发现美的眼睛! 为目标,爬取其中的图片。我们打开网页,首先要右键鼠标检查源码,此时问题出现了,右键鼠标怎么都按不出来,更别说检查网页源代码了。因为这个网站有个阻止我们使用F12功能的js文件 disable-devtool.min.js。怎么解决呢,也简单,提前打开F12再进入目标网站即可。
打开网站后,我们发现该网站是使用AJAX动态加载数据的。
那么我们在F12下的network选项卡里,切换到XHR,查找可能存在数据的AJAX请求。

在众多AJAX中,我们找到了admin-ajax.php,这个请求包含了我们需要的数据,打开预览可以看到请求到的数据。

请求找到了,接下来我们分析一下这个请求,切换回标头选项卡,我们发现该请求的链接是https://www.vmgirls.com/wp-admin/admin-ajax.php, 而请求方式是POST

既然请求方式是POST,那么肯定有一个表单数据会跟随提交,否则访问不到数据。比如我们直接在浏览器新的窗口打开该链接,会出现以下情况。

我们继续在表头选项卡下,找到该请求需要携带的参数如下
append,paged,action,query,page
通过分析多个请求,我们发现只有paged在变化,该参数代表我们请求的页码。

至此网页分析完毕,进入代码爬取环节。

2.爬取网页

2-1、模拟POST请求

首先模拟该Ajax请求。我们传入参数page来表示爬取的页码:

post_url = 'https://www.vmgirls.com/wp-admin/admin-ajax.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.75'
}def get_article_url(page):data = {'append': 'list-home','paged': page,'action': 'ajax_load_posts','query': '','page': 'home'}resp = requests.post(url=post_url, data=data, headers=headers)

2-2、解析图集列表页面

请求到页面后,我们发现每一个图集的链接都是存在与以下路径:

因此这一步我们要获取该页面下所有的图集链接,我们使用xpath来解析网页。

    text = resp.texthtml = etree.HTML(text)items = html.xpath('.//div[@class="col-6 col-md-3 d-flex py-2 py-md-3"]')for item in items:ar_url = item.xpath('.//div[@class="list-body"]/a/@href')[0]parse_img_page(ar_url)time.sleep(1)

2-2、解析图集页面

获取到图集链接后,接下来就要到图集的页面进行爬取。以你是我藏在星星里的浪漫为例,解析其中图片所存在的链接:

同样使用xpath解析网页,得到图片链接的列表。

def parse_img_page(article_url):resp = requests.get(article_url, headers=headers)text = resp.text# print(text)html = etree.HTML(text)title = html.xpath('.//h1/text()')[0]# print(title)image_url = html.xpath('.//div[@class="nc-light-gallery"]/a/@href')save_image(title=title, img_list=image_url)

2-3、保存图片

获取到所有图片链接后,接下来需要把图片保存到本地。但是这个过程出现了一个问题,如果我们直接去访问图片链接,比如在浏览器里输入图片链接,会得到以下结果:

得不到我们想要的图片。我们故技重施,使用F12大法,这次切换到img选项卡,找到请求图片的headers,如下图:

分析一下参数,authority参数,是每个图片链接的域名,值为:t.cdn.ink,
path参数,是该域名下,每张图片的存放路径,值为每张图片链接的后部,如:/image/2021/03/2021031708164777.jpeg,其他的参数没有变化。
编写请求图片的headers:

        authority = img_url.split('/')[2]path = re.sub('//t.cdn.ink', '', img_url)headers2 = {'authority': authority,'method': 'GET','path': path,'scheme': 'https','referer': 'https://www.vmgirls.com/','accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8','sec-fetch-dest': 'image','sec-fetch-mode': 'no-cors','sec-fetch-site': 'cross-site','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.75'}image_url = 'https:' + img_urlimage = requests.get(image_url, headers=headers2)

获取到图片后,需要将图片保存本地。

        img_name = re.sub('//t.cdn.ink/image/', '', img_url)img_name = re.sub('/', '-', img_name)with open(img_path + '\\' + img_name, 'wb') as file:file.write(image.content)file.close()

值得一提的是,我们提取到的图片链接中,其实有一些干扰项,而且图片的文件格式页不一定相同,比如有一些是.jpeg而有一些是.png:

我们可以在遍历图片链接的时候进行筛选,如果遇到不符合要求的图片链接就跳过,观察所有图片链接,发现它们都有个image字符串,以此作为筛选:

        if 'image' not in img_url:continue

2-4、执行爬虫

代码:

def main():for page in range(1, 3):get_article_url(page)time.sleep(2)if __name__ == '__main__':main()

3.爬取结果

以图集名为文件夹,以图片链接后部为文件名,以下是爬取结果:

打开其中某个文件夹:

搞定,撒花。

三、完整代码:

import requests
from lxml import etree
import re
import os
import timepost_url = 'https://www.vmgirls.com/wp-admin/admin-ajax.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.75'
}def get_article_url(page):data = {'append': 'list-home','paged': page,'action': 'ajax_load_posts','query': '','page': 'home'}resp = requests.post(url=post_url, data=data, headers=headers)text = resp.texthtml = etree.HTML(text)items = html.xpath('.//div[@class="col-6 col-md-3 d-flex py-2 py-md-3"]')for item in items:ar_url = item.xpath('.//div[@class="list-body"]/a/@href')[0]parse_img_page(ar_url)time.sleep(1)def parse_img_page(article_url):resp = requests.get(article_url, headers=headers)text = resp.text# print(text)html = etree.HTML(text)title = html.xpath('.//h1/text()')[0]# print(title)image_url = html.xpath('.//div[@class="nc-light-gallery"]/a/@href')save_image(title=title, img_list=image_url)def save_image(title, img_list):''':param title:图集名称:param img_list:图片链接:return:'''img_path = '.\image' + '\\' + titleprint(img_path)print(img_list)if not os.path.exists(img_path):os.mkdir(img_path)for img_url in img_list:if 'image' not in img_url:continueauthority = img_url.split('/')[2]path = re.sub('//t.cdn.ink', '', img_url)# print(img_name)headers2 = {'authority': authority,'method': 'GET','path': path,'scheme': 'https','referer': 'https://www.vmgirls.com/','accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8','sec-fetch-dest': 'image','sec-fetch-mode': 'no-cors','sec-fetch-site': 'cross-site','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.75'}image_url = 'https:' + img_urlimage = requests.get(image_url, headers=headers2)img_name = re.sub('//t.cdn.ink/image/', '', img_url)img_name = re.sub('/', '-', img_name)with open(img_path + '\\' + img_name, 'wb') as file:file.write(image.content)file.close()def main():for page in range(1, 3):get_article_url(page)time.sleep(2)if __name__ == '__main__':main()

四、总结

本次项目是AJAX爬虫的一个简单实践,希望能给小白一些提示,同时巩固自己学过的知识与技能。

Ajax爬取唯美女孩图片相关推荐

  1. Python爬取 | 唯美女生图片

    这里只是代码展示,且复制后不能直接运行,需要配置一些设置才行,具体请查看下方链接介绍: Python爬取 | 唯美女生图片 from selenium import webdriver from fa ...

  2. 使用requests 爬取唯美意境图片

    import requests import re import os url = 'http://image.baidu.com/search/index' date = {'cl': '2','c ...

  3. python爬虫之爬取“唯美“主流图片

    个人名片:

  4. 爬取唯美女生网站上所有小姐姐的照片

    爬取唯美女生网站 前几天刚好看到有人在教学爬取唯美女生网站(https://www.vmgirls.com)的图片,大致听了一下,只是介绍了一次爬取某一个小姐姐的照片,因此就尝试做一个爬取全站小姐姐照 ...

  5. 第一个爬虫项目-爬取唯美小姐姐网站

    爬取唯美小姐姐网站 链接: 源代码文件下载地址 展示 源代码 import requests import re import os import time# 伪装 用于可以伪装成浏览器. heade ...

  6. python使用 Scrapy 爬取唯美女生网站的图片资源

    python  python使用 Scrapy 爬取唯美女生网站 的资源,图片很好,爬取也有一定的难度,最终使用Scrapy获取了该网站 1.5W多张美眉照片....如有侵权,联系,立删除. ==== ...

  7. python超详细零基础 bs4解析之爬取唯美图片

    文章目录 前言 前言 本篇文章主要介绍使用bs4解析来爬取某网站上的唯美高清大图,涉及到的零碎知识较多,详细易懂,适合新手小白爬虫入门. 思路如下: ①拿到主页面的源代码,然后提取到子页面的链接地址h ...

  8. BeautifulSoup爬取唯美girls小姐姐图片

    0. 美好的事务能够使人心情预约,尤其是美丽的小姐姐哈哈哈,这篇文章是一篇爬虫实战,没有什么技术难点,主要使用BeautifulSoup库进行分析,重点讲解拿到一个网站时如何去分析页面源码. 1.用到 ...

  9. 练习使用WebMagic爬取唯美图片

    文章目录 前言 第一步 分析网站数据结构 第二步 代码实现 1.Maven仓库配置 2.PageProcessor代码 3.主程序 第三步 打完收工 前言 周末闲着没事,准备练习一下爬虫技术,同时也拓 ...

最新文章

  1. Finalize/Dispose/Destructor
  2. Linux中配置bochs
  3. navicat如何导入sql文件
  4. Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)
  5. mac os 开启redis_高并发大流量,总会想到它!来一起通过docker搭建redis集群
  6. linux下移除环境变量及mkdir命令介绍
  7. Static静态---笔记A
  8. C#课外实践——校园二手平台(心得篇)
  9. 安装php-zbarcode的步骤方法
  10. 红帽 Red Hat Linux相关产品iso镜像下载【百度云】(转载)
  11. 《怎样解题》思维导图
  12. 微信小程序订阅消息通过服务通知发送
  13. printf 输出格式、域宽
  14. 4815: [Cqoi2017]小Q的表格
  15. 云知声 Atlas 超算平台:基于 Fluid + Alluxio 的计算加速实践
  16. DFS hdu1181(变形课)
  17. ARVR技术 | AR, VR, MR和XR?想搞清楚不?
  18. 又是一道题拉开差距!IOI落幕,中国队三金一银,美国华人选手再获冠军
  19. 三分钟让闲置电脑变云主机
  20. 机器学习算法工程师面试学习经验

热门文章

  1. centos 配置mysql环境变量_Centos7安装并配置mysql5.6完美教程
  2. 练手项目一:图书馆CRUD
  3. mysql prepare 注入_PDO prepare足以防止SQL注入吗?
  4. 阿里云虚拟主机使用.htaccess绑定多域名多网站
  5. 判定二次曲面为椭球面的方法
  6. 老板没钱了,服务器如何缩容?
  7. mysql数据库 二十一练习题 及答案 (mysql练习题)
  8. java c盘写文件_Java将C盘一个文本文件复制到D盘
  9. 基于Echarts实现可视化数据大屏水质分析系统大屏数据
  10. 王易见新浪SHOW开讲------余额宝真的安全吗?