** 在生活和工作中,有时候需要在网络上获取大量信息,可是采用复制+黏贴的方式却带来,工作量大和信息采集不彻底等情况,今天介绍一种省时省力,并且可以快速获取信息的方法--爬虫**
一.爬取前分析
1.要想爬取网站,首先要分析妹子图的请求方式,看看它以什么方式渲染。这里妹子图只是利用了传统的网页(没有使用Ajax或js)
2.接着点击进入首页,发现一共有218页,然后每页的组图都有一个编号:183651,178973……
218.png image image3.然后点击进入页面,连续点击下一页,发现url存在一定规律,如图,url最2,3…依次递增
image image※通过分析,要想抓取图片,首先获取所有组图的编号,然后在每个组图后面添加该组的数量,就可以抓取全部图片了,下面我们就开始编写代码
二.代码部分
1.导入所需的库,并构造218页的网址
'''
import requests
import bs4
from bs4 import BeautifulSoup
import os
import time
start = time.time()
os.chdir('D:/Python/SPADER/')
#设置默认路径
headers = {
'Referer':'https://www.mzitu.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
#设置头部,防止反爬
def get_url():
for i in range(1,219):
yield 'https://www.mzitu.com/page/{}/'.format(i)
#构造218页的每个网页网址
'''
2.创建一个列表,存储所有组图的的编号,并构造链接
'''
def get_html(url):
try:
r = requests.get(url,headers=headers)
r.enconding = r.apparent_encoding
return r
except Exception as err:
print(err)
#创建函数获取HTML函数
imgs=[]
def get_href(url):
res = get_html(url)
soup = BeautifulSoup(res.text,'html.parser')
a = soup.select('div.postlist ul#pins li a')
for i in a:
if i['href'] not in imgs:
imgs.append(i['href'])
else:
continue
for j in get_url():
get_href(j)
#将所有的url存入imgs
'''
imgs.png
#从图片上可以看到,我们已经构造了5225个组图的url,之后通过循环遍历,我们就可以抓取5225组照片,大约30万张照片
3.通过构建的网址,逐一爬取照片并存储到文件夹中
'''
for img in imgs[:100]:
res = get_html(img).text
soup = BeautifulSoup(res,'html.parser')
count = soup.select('div.content div.pagenavi a')[-2].string
#这个count可以了解组图有多少张照片
for c in range(1,int(count)+1):
url = img + '/' + str(c)
respon = get_html(url)
soup1 = BeautifulSoup(respon.text,'html.parser')
for src in soup1.select('div.main-image p a img'):
src=src['src']
file = url.split('/')[-2]
header = {
'Referer':url,
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
conten = requests.get(src,headers=header)
isExists = os.path.exists(file)
# 判断结果
if not isExists:
\ # 如果不存在则创建目录
# 创建目录操作函数
os.makedirs(file)
path = src.split('/')[-1]
with open(file+'/'+path, 'wb') as f:
f.write(conten.content)
f.close()
print(src)
time.sleep(0.3)
end = time.time()
spend = end-start
print('共花费{:.2f}秒'.format(spend))
#通过调用time函数,可以知道花费多长时间完成工作
'''
网友评论