引言:
进过前戏的讲解,应该都有一些了解了吧。接下来就进入正题吧。
为了增加大家的兴趣,我就从搜狗图片的爬取讲解吧
python爬虫的步骤:
一般为四步骤:
1、发起请求
对服务器发送请求需要的url进行分析,与请求需要的参数
2、获取响应内容
如果服务器能正常响应,则会得到一个Response的对象,该对象的文件格式有:html,json,图片,视频等
3、解析内容
如果我们需要的信息在网页(html文件)里面,则需要提取网页的某种信息,称为:解析html数据:方法有
正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以wb的方式写入文件
4、保存数据
对爬取到的数据进行存储。
文件
数据库(MySQL,Mongdb、Redis)
爬取的网页:搜狗图片搜索 - 上网从搜狗开始 (sogou.com)
一、先分析一下url链接:
搜索1图片回车之后的链接。
from urllib.parse import quote
key=quote('氧气美女')
把括号里面的中文可以替换你想要的即可,它会自动转换为query需要的字符串。
二、网页分析
win+F12,开发者,点击网格,会发现什么也没有ctrl+R刷新
我先说明一下,Sogou是动态加载图片的,需要再分析一下链接。这里需要通过分析XHR。
因为每一页加载的图片是有限的,通过不断的往下滑它会动态的加载下一页。
通过不停的往下滑动,不断地加载图片。会发现它会不断地出现一个重复的searchList?mode
通过分析每一页的请求url
第一个:
https://pic.sogou.com/napi/pc/searchList?mode=1&start=48&xml_len=48&query=氧气美女
第二个:
https://pic.sogou.com/napi/pc/searchList?mode=1&start=96&xml_len=48&query=氧气美女
对比可知道只有start=的数字不同,由len可知道每一页有48张图片,所以每次的开始是48的倍数
再通过预览分析图片需要的片头url,与名字
可以看到真的有48个
进过分析图片的地址是thumbUrl的值(具体是:['data']['items']['thumbUrl'])
其实oriPicUrl要高清许多,但是需要用到后面的知识。
图片名字title(具体是:['data']['items']['title']):
三、实现代码(注意本代码只用于学习交流,要遵守网络协议,切勿用于商业)
import requests
from urllib.parse import quote
# 搜索的内容
key = quote('氧气美女')
# 第几页, 每一页有48张图片。每一页的开始是48的倍数
page=2
start=(page-1)*48
# 拼接url链接
# .format的括号()里面的会代替花括号{},且按顺序一对一,例如第一个{}用start代替,第二个{}用key代替
url = 'https://pic.sogou.com/napi/pc/searchList?mode=1&start={}&xml_len=48&query={}'.format(start,key)
# 发送请求,对url对应的服务器发送
response = requests.get(url)
# response把它转化为json的数据格式,才能用类似于字典的数据,来获取对应的值
json_data = response.json()
all_data = json_data['data']['items']
# 图片的url,下载图片的url
pic_urls=[]
# 图片的title,保存图片的名字
pic_titles=[]
for data in all_data:
url = data['thumbUrl']
# 把url添加到pic_urls
pic_urls.append(url)
# 把title添加到pic_titles
title = data['title']
pic_titles.append(title)
# 保存
for number in range(len(pic_titles)):
data=requests.get(pic_urls[number],timeout=5).content
# 写入文件,以jpg
with open('./'+pic_titles[number]+str(number)+'.jpg','wb')as file:
file.write(data)
print(number,'-----------------',pic_titles[number],'下载好了------------------')
每次只需要改变
# 搜索的内容
key = quote('氧气美女')
与 page=2
两个地方即可获取不同的图片。