嗨喽,大家好呀~这里是爱看美女的茜茜呐
Python 3.8 / 编译器
Pycharm 2021.2版本 / 编辑器
requests : 主要用来发 送 HTTP 请求 、 属于第三方模块
parsel : 解析html,xml内容,获取需要的数据 、属于第三方模块
re :python独有的匹配字符串的模块 、内置模块,无需安装
json :该模块就可以完成 JSON 与 Python 两种数据格式的相互转换 、内置模块,无需安装
第三方模块安装:
在cmd里面或者pycharm终端里面进行安装 pip install requests 安装。
一. 关于数据来源查询:
找不到数据来源,不知道去采集 ?
采集 P站数据内容 主要是图片壁纸
找单张图片url地址
找这个图片url地址来源
来自于图片详情页url:
找多张图片url地址参数变化
在图片列表页可以获取每个图片详情页url地址
二. 代码实现思路:
发送请求:
获取数据
解析数据
保存数据
导入模块
import requests
import parsel
import re
import json
import pprint
def change_title(title):
mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
new_title = re.sub(mode, '_', title)
return new_title
多页采集
for page in range(1, 11):
print(f'======================正在爬取第{page}页数据内容======================')
url = f'*****/hot_{page}'
发送请求
需要加上headers 请求头
请求头:
把Python代码伪装成浏览器向服务器发送请求
user-agent:
浏览器的信息
headers = {
'user-agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
模拟浏览器对服务器发送请求, 然后服务器就给我们返回一个响应数据 response
response = requests.get(url=url, headers=headers)
# response.text 获取网页的文本数据
# print(response.text)
解析数据
css选择 xpath re正则表达式 bs4 parsel
首先需要把 response.text 这个网页字符串 转换成 selector 对象
selector = parsel.selector(response.text)
css选择器
就是根据标签属性内容提取相关数据
标签里面的class类 开头用一个圆点 . 可以代替
attr() 属性选择器
选择标签里面什么属性内容 text 取标签的文本数据
getall() 取所有标签内容
返回的是一个列表
href = selector.css('.px-img a::attr(href)').getall()
titles = selector.css('.px-info .px-info-title::text').getall()
我要提取一个列表每一个元素 是通过遍历
zip() 一个合并函数
可以把两个列表合并到一起 返回的一个zip对象
通过遍历zip对象 给我们返回的一个元组
zip_data = zip(href, titles)
# print(zip_data)
for index in zip_data:
index_url = '****' + index[0]
title = index[1]
response_1 = requests.get(url=index_url, headers=headers)
# print(index_url)
# print(response_1.text)
# re.findall('写匹配规则', '在哪里匹配')
# \ 转义字符 主要把哪些特殊字符 转义成除了自己本身字符意思 不含有其他任何特殊意思
# 正则表达式 匹配出来的内容 是列表
html_data = re.findall('window\.__INITIAL_STATE__=(.*?)', response_1.text)
json_data = json.loads(html_data)
json字典取值
键值对取值, 根据冒号左边的关键字 提取冒号右边的值
img_data = json_data['tag']['worksDetailData']['coverImage']['path']
img_url = '*****' + img_data + '?imageView2/3/q/85/interlace/1/w/2560/h/2560/format/webp'
split() 字符串分割 以 ‘.’ 分割成一个列表
img_name = img_data.split('.')[-1]
保存数据
# print(img_url)
# print(title)
# print(type(json_data))
# break # 跳出循环 只打印一个就好了
# response.content 获取网页二进制数据 图片/视频/音频/特殊格式的文件 这些都是需要获取二进制数据
new_title = change_title(title)
img_content = requests.get(url=img_url, headers=headers)
with open('img\\' + new_title + '.' + img_name, mode='wb') as f:
f.write(img_content)
print(title)
大家觉得有用的话可以来个免费的点赞+收藏+关注,
防止下次我悄悄更新了好东西你却不知道 !!!
感谢你观看我的文章呐~本次航班到这里就结束啦
希望本篇文章有对你带来帮助 ,有学习到一点知识~
躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀