爬虫步骤详解
以爬取摄图网为例 ‘’https://699pic.com/tupian/so.html‘
1.准备起始url
这个步骤可以说是爬虫的关键
我们先来看 https://699pic.com/tupian/so.html
我们接下来在搜索框输入 关键词 宝马
拿到相应的url https://699pic.com/tupian/baoma.html
然后输入美女 得到相应的url https://699pic.com/tupian/meinv.html
这样我们就拿到了起始的url
我们设置title = input(‘请输入标题’)
但是这里有一个问题 title需要转换成拼音 才是正确的url
可以通过from xpinyin import Pinyin解决
– start_url = f’https://699pic.com/tupian/{title}.html’
附上headers ={ ‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36’,}
2.发送请求,获取响应
response = requests.get(start_url,headers=headers)
#打印观察
printf(response.status_code)
–状态码为200 说明请求成功
3.解析响应,数据提取
html_str = response.content.decode()
然后我们在网页中找到我们需要的数据
拿到这个 //img95.699pic.com/photo/50108/2763.jpg_wh300.jpg
放进浏览器看看
这说明我们接下来只要拿到这个data-original的值就行了。这里我使用正则匹配获取,代码如下:
data_list_1 = re.findall(‘data-original="(.*?)"’, html_str)
此时我们拿到了图片url的集合,打印后发现存在2个问题
1.获取到了我们不需要的数据
2.获取的数据中有重复的
同时,我们还没有给图片命名,于是我采用集合和枚举的方法解决
data_list = list(set(data_list_1))
set利用集合的特性进行去重,list将其转化为列表方便我们遍历处理
for num, img_url in enumerate(data_list):
num值是img_url,在data_list中的下标
url = 'https:' + img_url
现在我们打印url 观察一下
我们可以通过状态码来跳过,无法请求的‘假’url
resp = requests.get(url)if resp.status_code != 200:continueelse:data = resp.content
4.保存数据
with open(os_path_1 + str(num) + ‘.jpg’, ‘wb’)as f:
f.write(data)
print(f’第{num+1}张图片保存完成’)
好像有奇怪的东西0…0
完整代码如下:
!/usr/bin/env python
-- coding: utf-8 --
#@author:uuyjp
from xpinyin import Pinyin
import requests, re, osp = Pinyin()os_path = os.getcwd() + '/数据/'
if not os.path.exists(os_path):os.mkdir(os_path)
while True:# 1.准备起始的url地址title_1 = input('请输入壁纸标题:')os_path_1 = os_path + f'/{title_1}/'if not os.path.exists(os_path_1):os.mkdir(os_path_1)title = p.get_pinyin(title_1).replace('-', '')# print(title)start_url = f'https://699pic.com/tupian/{title}.html'# print(start_url)"""构造headers"""# https/http 请求# 1.请求头headers = {# 伪装成为一个浏览器,人的操作,达到欺骗服务器的目的'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',}# 2.发送请求,获取响应response = requests.get(start_url, headers=headers)#3.解析响应,数据提取html_str = response.content.decode()# 正则data_list_1 = re.findall('data-original="(.*?)"', html_str)# 集合data_list = list(set(data_list_1))# 循环遍历,取出每一个url地址找for num, img_url in enumerate(data_list):# num值是img_url,在data_list中的下标url = 'https:' + img_url# print(url)try:resp = requests.get(url)if resp.status_code != 200:continueelse:data = resp.content# 4.保存数据with open(os_path_1 + str(num) + '.jpg', 'wb')as f:f.write(data)print(f'第{num+1}张图片保存完成')except:continue