Python爬虫实战之爬取网站全部图片(一)
程序员文章站
2022-05-27 08:47:39
...
通过python 来爬取网站内所有的图片到本地
这个网站的内容比较好操作 因为所有的请求都是同步的 不存在操作js 后面的文章中会讲到如何对ajax操作的请求进行抓取
其实反而他如果用ajax请求 我们操作起来还简单了 最起码不用写这么多代码了
而且这套代码也使用的最为暴力的方式 直接requests.get或者requests.post 后面的文章中会采用Session保持回话的方式进行操作
爬取网址: http://www.meizitu.com/a/more_1.html
一.获得图片地址 和 图片名称
1.进入网址之后 按F12 打开开发人员工具点击elemnts
2.点击下图的小箭头 选择主图中的任意一个图片 那我们这里点击第一个 图片
3.显示控制台 为了验证xpath是否正确
4.通过xpath获得a的href 和 title.
(请放大看)我们看到 他提示的是有10个 我们回到网站中看一下 在主页上数一下 他确实是10个 也就是说 我们获得的href 和title是没有任何问题的 那么留着为我们后面使用.
5.我们还需要访问这个链接的请求头的信息 以备后面操作的时候来使用
这里可以看到 没有什么特别的请求头
6.获得每套图里的 所有图片.这也是我们的目的所在 不然前面那么多工序不是浪费吗。
可以看到 我们获得了11个链接地址 不要被源码中的文字所迷惑
7.获得相应的请求头
可以发现 需要注意的只有一个字段Referer 这里的地址就是我们访问这个页面进来的时候的那个地址 只要把那个地址给上就行了
8.对于404的处理 如果出现了404那就只有重新请求了
二.编写python代码实现爬取.
1.需要用到的库有:
Requests lxml 如果没有安装的请自己安装一下
2.IDE : pycharm
3.python 版本: 2.7.15
4.代码实现的是多线程下载,多线程的好处 就不用我多说了。
import requests
import os
from lxml import etree
from threading import *
from time import sleep
nMaxThread = 3 #这里设置需要开启几条线程
ThreadLock = BoundedSemaphore(nMaxThread)
gHeads = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
class Meizitu(Thread):
def __init__(self,mainReferer,url,title):
Thread.__init__(self)
self.MainReferer = mainReferer
self.url = url
self.title = title[3:-4] #这里是为了把<b></b>给删除
def run(self):
try:
urlList = self.GetPhotoUrl()
if len(urlList) > 0 and urlList != None:
self.SavePath(urlList)
finally:
ThreadLock.release()
def GetPhotoUrl(self):
heads={
"Referer":self.MainReferer
}
heads.update(gHeads)
html = requests.get(self.url,headers=heads)
if html.status_code == 200:
xmlContent = etree.HTML(html.text)
urlList = xmlContent.xpath("//div[@id='picture']/p/img/@src")
return urlList
else:
return None
def SavePath(self,urlList):
heads = {
"Referer": self.url
}
heads.update(gHeads)
savePath = "./photo/%s" % self.title
if not os.path.exists(savePath):
os.makedirs(savePath)
for i in range(len(urlList)):
j = 0
while j<5:
print "Download : %s/%d.jpg" % (self.title.encode("gbk"), i + 1)
html = requests.get(urlList[i],headers=heads)
if html.status_code == 200:
with open(savePath + "/%d.jpg"%(i+1),"wb") as f:
f.write(html.content)
break
elif html.status_code == 404:
j+=1
sleep(0.05)
continue
else:
return None
def main():
while True:
try:
nNum = int(raw_input("请输入要下载几页: "))
if nNum>0:
break
except ValueError:
print("请输入数字。")
continue
for i in range(nNum):
url = "http://www.meizitu.com/a/more_%d.html"%(i+1)
html = requests.get(url,headers=gHeads)
if html.status_code == 200:
xmlContent = etree.HTML(html.content)
hrefList = xmlContent.xpath("//div[@class='pic']/a/@href")
titleList = xmlContent.xpath("//div[@class='pic']/a/img/@alt")
for i in range(len(hrefList)):
ThreadLock.acquire()
t = Meizitu(url,hrefList[i],titleList[i])
t.start()
if __name__ == '__main__':
main()
5.结果:
上一篇: 证明性别