此教程为在某吧里面爬取某个页面的所有的图片
1.首先,老样子,我们要先将我们的爬虫变得更像一个人。
首先用谷歌浏览器打开我们所需要爬取的界面
然后进行元素的审查(浏览器都是按f12),打开里面的Network,点击左边的第一个,然后将右边的Header往下拉,找到User-Agent这个值(这个值的目的是为了应对简单的反扒机制,有的网页会进行监测,普通的python在User-Agent这一块显示的是python的详细信息),记录下User-Agent的值。
2.进行python代码的准备工作
首先导入我们所需要的库文件(urllib.request是每个网络爬虫必须要使用到的库,而re这个库是为了使用正则表达式,这样可以保证爬取的难度降低。)
import urllib.request
import re
紧接着,我们先将我们的整个网页爬取下来。其中,这个add_header的值就是将我们的User-Agent的值导入到req里面去,这样就保证了我们的爬虫看上去更像是一个人的操作。附:这里面的url就是我们要爬取的网页的网页地址
def open_url(url):
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36')
page=urllib.request.urlopen(req)
html=page.read().decode('utf-8')
return html
3.进行对爬下来的页面进行处理并将图片进行下载(以达到网络爬虫的目的)
这里面的p是为了找到图片的位置,我们先将其放在这个地方,然后re.findall这个函数是为了找到网页里面符合p条件的所有图片(以便确定到所有的图片的地址)。附:re.findall这个函数返回的是一个列表,里面包含着所有的地址。
def get_img(html):
p=
imglist=re.findall(p,html)
for each in imglist:
print(each)
我们继续对页面进行审查。
我们对页面进行审查后,找到了图片的位置,我们将其前面的值复制下来给到p,这样方便定位。代码为:
def get_img(html):
p=r'<img class="BDE_Image" pic_type="\d" width="\d\d\d" height="\d\d\d" src="([^"]+\.jpg)"'
imglist=re.findall(p,html)
for each in imglist:
print(each)
注意,这里面的for循环还不是爬取,只是为了确定我们的代码能够运行且运行时正常的。
注意,p里面有一个亮点,在src里面,我们使用到了(),这个小括号是为了帮助我们直接定位到src,如果我们不使用的话,会返回这个图片的很多信息(我们下载图片只需要知道它的地址就可以了,其它的都是无用的信息。),详细用法可以百度一下python里面正则表达式的用法(爬虫里面正则表达式相当重要,相当重要,相当重要,重要的事说三遍)
如果运行这个函数,能够得到下面类似的结果,则表明我们的爬取是成功的。
然后我们得到了图片的地址,我们再将图片的数据保存到本地就ok啦。(urllib.request库里面的urlretrieve函数可以将文件保存下来。)
全部代码为:
import urllib.request
import re
def open_url(url):
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36')
page=urllib.request.urlopen(req)
html=page.read().decode('utf-8')
return html
def get_img(html):
p=r'<img class="BDE_Image" pic_type="\d" width="\d\d\d" height="\d\d\d" src="([^"]+\.jpg)"'
imglist=re.findall(p,html)
'''
for each in imglist:
print(each)
'''
for each in imglist:
filename=each.split("/")[-1]
urllib.request.urlretrieve(each,filename,None)
if __name__=='__main__':
url="https://tieba.baidu.com/p/6338324817"
get_img(open_url(url))
运行效果为:
我们已经将这个页面的符合我们要求的图片都保存下来了(保存的路径楼主没有设置,默认是和代码在一个文件夹里面的),我们的筛选条件就是我们的p,通过p来定位到符合条件的图片。