机缘巧合下得知小张的喜好二次元 美女 动漫 …图片做电脑壁纸, 而选择壁纸成为小张的难题
正好遇到我这种有乐于助人的精神的人, 怎不会出手相助呢?
咳咳…
步入正题
- 以下本次所用到的模块
import requests # 用于请求
import time
import random
from lxml import etree
from fake_useragent import UserAgent # 伪造 User-Agent的值
以上缺少模块的小伙伴可通过以下安装
pip install 模块名
权限不足的加上sudo
sudo pip install 模块名
如:
缺少 lxml
模块可以使用
使用以下命令安装
pip install lxml
sudo pip install lxml
fake_useragent
模块缺失
使用以下命令安装
pip install fake_useragent
或者也可以不用fake_useragent
这个模块
可以到浏览器页面按F12
调出开发人员工具, 后按F5
刷新一下会得到很多请求如下:
然后选择一个鼠标单击下会出现如图所示这里以火狐浏览器为例
:
直接复制User-Agent
这一项也可以使用的
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0
注意:复制的需改成字典形式使用
headers = {"User-Agent": " Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0"}
谷歌浏览器
则如图所示:
调出开发人员工具选择Network
后同火狐浏览器操作即可
正篇来了
- 定义主要功能函数
def get_html(self, url):
'''处理页面'''
html = requests.get(url=url,
headers=self.headers).content.decode('gbk') # 一些网页需要指定下编码
return html
编码获取方法:
右键点击网页 —>查看页面源代码
一般都在这个<meta charset="gbk" />
标签中有声明
注:这里以本次爬取的为例
- 推荐了解一下
xpath
可以去谷歌商店下载xpath
插件, 方便验证和获取xpath
def send_next(self, url):
'''获取下层页面的url'''
html = self.get_html(url=url)
# element对象是xpath语法的使用对象,element对象可由html字符串转化
# 这里利用etree.HTML()将html字符串转化为element对象
obj = etree.HTML(html)
# 目标获取下一层的大图
imgs_url = obj.xpath('/html/body/div[2]/div/div[3]/ul/li/a/@href')
def crawl(self):
'''执行函数'''
self.send_next(url=self.url)
# 这里我们只需从第二页开始抓取
for i in range(2, 148):
page_url = f'http://pic.netbian.com/4kdongman/index_{i}.html'
self.send_next(url=page_url)
# 注意控制抓取频率
time.sleep(random.randint(1, 4))
- 多页获取
对比一下每页url
的区别
http://pic.netbian.com/4kdongman/
http://pic.netbian.com/4kdongman/index_2.html
http://pic.netbian.com/4kdongman/index_3.html
…
http://pic.netbian.com/4kdongman/index_147.html
多次比较 经过… 发现第2页到最后一页
每一页区别在于页数改变后 index_页数.html 中同页数一致
了解完啦!可以上手了
完整代码
# -*- coding: UTF-8 -*-
'''
PyCharm
@Project :
@File :
@Author :
@Date :2021/1/7
'''
### 以下本次所用到的模块
import requests
import time
import random
from lxml import etree
from fake_useragent import UserAgent # 伪造 User-Agent的值
# requests + xpath 爬取图片
class Image:
def __init__(self):
self.url = 'http://pic.netbian.com/4kdongman/'
self.headers = {'User-Agent': UserAgent().random}
self.item_url = 'http://pic.netbian.com'
def get_html(self, url):
'''处理页面'''
html = requests.get(url=url,
headers=self.headers).content.decode('gbk') # 一些网页需要指定下编码
return html
def send_next(self, url):
'''获取下层页面的url'''
html = self.get_html(url=url)
### 重要:页面中xpath不能全信, 一切以响应内容为主
obj = etree.HTML(html)
# 这里我们不获取小图
# 目标获取下一层的大图
# 先获取通往下层的url
imgs_url = obj.xpath('/html/body/div[2]/div/div[3]/ul/li/a/@href')
# imgs_url 获取的数据为
# ['/tupian/26687.html', '/tupian/26686.html', ... ,'/tupian/26685.html']
self.send_img(imgs_url)
def send_img(self, imgs_url):
'''获取大图'''
for index in imgs_url:
items_url = self.item_url + index
# 大图的url为
# http://pic.netbian.com/tupian/26681.html
# 拿取每个后缀 拼接得到完整的大图url
html = self.get_html(url=items_url)
element = etree.HTML(html)
images = element.xpath('/html/body/div[2]/div[1]/div[2]/div[1]/div[2]/a/img/@src')
self.data(images)
def data(self, images):
'''数据处理 存储图片'''
for img in images:
# 由于这里的图片可以直接访问到 就方便许多了
html = requests.get(url=self.item_url + img).content
# 这里图片命名以/分割 /uploads/allimg/210103/232202-16096873226fa1.jpg
# 取分割后的最后一个命名图片
with open(f'./img/{img.split("/")[-1]}', 'wb') as file:
file.write(html)
def crawl(self):
'''执行函数'''
# 注: 第1页 url为
# http://pic.netbian.com/4kdongman/
self.send_next(url=self.url)
# 这里我们只需从第二页开始抓取
for i in range(2, 148):
page_url = f'http://pic.netbian.com/4kdongman/index_{i}.html'
self.send_next(url=page_url)
print('已换下一页开始抓取')
# 注意控制抓取频率防止限制IP访问
time.sleep(random.randint(1, 4))
# 程序入口
if __name__ == '__main__':
image = Image()
image.crawl()