大家好,又见面了,我是你们的朋友全栈君。
简述
作为一个考研狗,每天除了日复一日的复习外,偶尔也想给自己寻找一些生活的小乐趣,今天突然想到了自己曾经稍微接触的爬虫,想看看可以爬取些图片放到电脑上,就花了些时间改了改之前的爬虫代码,爬取了一部分照片先量一下战绩吧。照片不多但也算是自己的一次爬虫小经验。
实现思路
爬虫的网页很简单,照片真实路径都在页面中直接可以拿到
主要流程就是先进入照片浏览的主页,每个照片的主页都会链接几个照片页面,像下面这样,每个图片都会链接一个网页
图片链接的网页如下图所示
但是这个页面显示的图片还是不够高清,这个网站有一个规律,更高清的照片存放的网页就在现在这个页面的路径后跟一个 -1920×1080 的htm中,进入这个htm之后展示的照片才是我们要的,拿到图片的url就直接下载就好,就这样一直循环,所有的照片就都下载下来了。
关键代码
文件下载
import requests
import time
def downloadFile(name, url):
try:
headers = {
'Proxy-Connection': 'keep-alive'}
r = requests.get(url, stream=True, headers=headers)
print("=========================")
print(r)
length = float(r.headers['Content-length'])
f = open(name, 'wb')
count = 0
count_tmp = 0
time1 = time.time()
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk) # 写入文件
count += len(chunk) # 累加长度
# 计算时间 两秒打印一次
if time.time() - time1 > 2:
p = count / length * 100
speed = (count - count_tmp) / 1024 / 1024 / 2
count_tmp = count
print(name + ': ' + formatFloat(p) + '%' + ' Speed: ' + formatFloat(speed) + 'M/S')
time1 = time.time()
f.close()
return 1;
except:
print("出现异常")
return 0;
def formatFloat(num):
return '{:.2f}'.format(num)
if __name__ == '__main__':
downloadFile('D://file//photo//hd.jpg',
'https://browser9.qhimg.com/bdr/__85/t01753453b660de14e9.jpg')
文件下载没什么好说的,复制就可以用,这里做了一个异常捕获的处理,因为可能出现连接不上资源,或则目标服务器强制关闭连接的可能,做这个异常处理就是为了判断有没有异常出现,从而进行相应的处理
爬虫代码
# -*- codeing = utf-8 -*-
# @Time : 2021/6/19 23:01
# @Author : xiaow
# @File : PhotoSpider.py
# @Software : PyCharm
from bs4 import BeautifulSoup # 网页解析
import xlwt # excel操作
import sqlite3 # 数据库操作
from api import spider2 as spider
import time
from api import FileDownload as fd
import re # 正则表达式
imglink = re.compile(r'<a href="(.*?)" target="_blank" title=".*?"><img alt=".*?" src=".*?"/><b>.*?</b></a>', re.S)
img2link = re.compile(r'<a href="(.*?)" target="_blank">.*?<span>(1680x1050)</span></a>', re.S)
img3link = re.compile(r'<img alt=".*?" src="(.*?)" title=".*?"/>', re.S)
# 获取照片页面路径
def getPhoto(url):
srcs = []
html = spider.askURL(url);
bs = BeautifulSoup(html, "html.parser");
for item in bs.find_all('a', target="_blank"):
item = str(item)
src = re.findall(imglink, item)
if (len(src) != 0):
srcs.append("http://www.netbian.com" + src[0])
return srcs;
# 照片主页显示的照片不够清楚,这里根据这个网站存储照片的规律,拼接了一个地址,这个地址的照片比较高清一些
def getPhotoUrl(url):
purls = [];
url3 = "http://www";
url2 = url.split(".")
for j in range(1, len(url2)):
if j == len(url2) - 2:
url3 = url3 + "." + url2[j] + "-1920x1080"
else:
url3 = url3 + "." + url2[j]
return (url3)
# 下载照片
def downloadPhoto(url):
html = spider.askURL(url);
bs = BeautifulSoup(html, "html.parser");
for item in bs.find_all("img"):
item=str(item)
itemsrc=re.findall(img3link,item)
if(len(itemsrc)!=0):
return itemsrc[0]
if __name__ == '__main__':
src = "http://www.netbian.com/mei/index_";
# 拼接照片主页的路径
for i in range(2,163):
time.sleep(5)
src2 = "";
src2=src+str(i)+".htm"
urls=getPhoto(src2)
for j in range(len(urls)):
time.sleep(3)
fd.downloadFile('D://file//photo//hd'+str(time.time())+".jpg",downloadPhoto(getPhotoUrl(urls[j])))
成果
展示几张照片吧
更新
解析网页的封装类
#-*- codeing = utf-8 -*-
#@Time : 2021/3/1 16:16
#@Author : xiaow
#@File : spider2.py
#@Software : PyCharm
import re # 正则表达式
import sys
import urllib.request, urllib.error # 指定url,获取网页数据
from bs4 import BeautifulSoup # 网页解析
import xlwt # excel操作
import sqlite3 # 数据库操作
baseurl = 'https://movie.douban.com/top250?start='
imglink = re.compile(r'<a href=".*?" title=".*?">', re.S)
# titlelink = re.compile(r'<span class="title">(.*)</span>')
# findlink = re.compile(r'<a href="(.*?)">') # 创建正则表达式 表示规则
# 1.爬取网页
def getData(url):
urllist = []
valuelist = []
# 2.解析数据
img = []
src = []
title = []
for i in range(0, 10):
url = baseurl + str(i * 25)
html = askURL(url)
bs = BeautifulSoup(html, "html.parser")
print(bs)
# urllist.append(bs.a.attrs["href"])
# valuelist.append(bs.a.string)
# return urllist, valuelist
for item in bs.find_all('div', class_="item"): # 查找div 并且该div应满足class=item
# print(item)
item = str(item)
# titlel = re.findall(titlelink, item)
# title.append(titlel)
# srcl = re.findall(findlink, item) # 正则表达式进行筛选
# for s in srcl:
# src.append(s)
imgl = re.findall(imglink, item) # 正则表达式进行筛选
for i in imgl:
img.append(i)
return title, img, src;
# 得到一个url的网页内容1
def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36",
"Cookie": '_ga=GA1.2.1191993538.1623990557; _gid=GA1.2.176559558.1623990557; HstCfa3699098=1623990557028; HstCmu3699098=1623990557028; HstCnv3699098=1; HstCns3699098=1; newurl=0; __dtsu=10401623990557D693AE61F09F524965; pbnfgecookieinforecord=%2C64-32128%2C64-32129%2C; HstCla3699098=1623991353818; HstPn3699098=7; HstPt3699098=7'
}
req = urllib.request.Request(url=url, headers=head)
html = ""
try:
response = urllib.request.urlopen(req)
html = response.read()
except Exception as result:
print(result)
return html
# 3.保存数据
def savaData(savepath):
pass
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148823.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...