爬虫的基本步骤:
- 向目标网页URL发送请求获取响应的内容
- 根据要爬取的内容编写正则表达式或xpath抓取
- 将爬取内容存储
以下将一步步解析一个图片爬虫如何编写
1. 发送请求
这里需要用到requests模块,如果没有可进入命令窗口用pip安装:
pip install requests
接下来爬取这个网页:
注意右上角红框,点击传统翻页版,瀑布流的处理方式复杂,就不说了,其实我也不会。。。。。
然后向网页发送请求:
#-*-coding:utf-8-*-
import requests
import os
import re
#搜索关键词 "python 爬虫" 网页的url
url='https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=python%20%E7%88%AC%E8%99%AB%20'
html=requests.get(url).text #发送请求,返回响应的text文本内容
2.编写正则表达式或xpath爬取
在传统翻页版上按F12进入开发者模式
2.png用选择工具点击图片可以在右边开发者模式看到图片链接在网页源码的位置
3.png
进入网页源码查找这个图片链接:
4png
可以发现三个链接,但其中只有后面两个链接打开的图片是大图所以用后面的链接,然后编写正则表达式。
正则表达式就是一个头一个尾把要爬取的内容夹在中间,这样就可以把它取出来了,我们现在爬取的是图片链接,所以查看链接左右是什么,写出下面的表达式
pic_urls=re.findall(r'"hoverURL":"(.*?)"',html,re.S)
第一个参数就是表达式,提取的就是"hoverURL":
后面的内容re.findall
是寻找所有符合的内容,也就是把所有图片的链接提取出来,第二个参数是网页响应内容,第三个参数re.S
是防止由于链接换行而提取不到。
3.保存图片
提取好了图片链接,接下来就可以访问图片链接,将图片内容写进文件里
#创建文件夹
try:
os.makedirs(r'C:\Users\Administrator\Desktop\pictures')
except:
print('filename has existed already')
#逐张下载
count=0
for each in pic_urls:
print('Downloding...',each)
try:
result=requests.get(each,timeout=10)#设置超时时间
except:
print('Unable to load')
#图片命名
filename=str(count)+'.jpg'
with open(r'C:\Users\Administrator\Desktop\pictures\\'+filename,'wb') as f:
f.write(result.content)#将图片内容写进文件
count+=1
效果:
5.png最终下载了30张图片
附上全部代码:
#-*-coding:utf-8-*-
import requests
import os
import re
#搜索关键词 "python 爬虫" 网页的url
url='https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=python%20%E7%88%AC%E8%99%AB%20'
html=requests.get(url).text #发送请求,返回响应的text文本内容
pic_urls=re.findall(r'"hoverURL":"(.*?)"',html,re.S)
#创建文件夹
try:
os.makedirs(r'C:\Users\Administrator\Desktop\pictures')
except:
print('filename has existed already')
#逐张下载
count=0
for each in pic_urls:
print('Downloding...', each)
try:
result=requests.get(each,timeout=10)#设置超时时间
except:
print('Unable to load')
#图片命名
filename=str(count)+'.jpg'
with open(r'C:\Users\Administrator\Desktop\pictures\\'+filename,'wb') as f:
f.write(result.content)#将图片内容写进文件
count+=1
网友评论