彼岸桌面
参考文章:https://www.cnblogs.com/franklv/p/6829387.html
今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只是很久之前学过一些,很多基础语句都不记得了,于是直接在网上找了个有基础操作语句的爬虫代码,在这上面进行修改以适应我的要求和爬取的网页需求
我爬取的网页如下:
彼岸桌面网唯美图片:http://www.netbian.com/weimei/index.htm
注意:这次爬取的网页的图片是静态的,没有爬取js,而且之前爬虫就学了一点也没很深入,所以代码写的很丑,而且因为写这个主要是为了给电脑爬个壁纸,所以侧重功能,一些地方能简单解决的就简单解决了,在此建议想好好学习爬虫的还是多多钻研,不要取巧
下面代码来自上面的参考文章:
import requests
from bs4 import BeautifulSoup
import os
def getHtmlurl(url): #获取网址
try:
r=requests.get(url)
r.raise_for_status()
r.encoding=r.APParent_encoding
return r.text
except:
return ""
def getpic(html): #获取图片地址并下载
soup =BeautifulSoup(html,'html.parser')
all_img=soup.find('ul',class_='pli')find_all('img')
for img in all_img:
src=img['src']
img_url=src
print (img_url)
root='D:/pic/'
path = root + img_url.split('/')[-1]
try: #创建或判断路径图片是否存在并下载
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(img_url)
with open(path, 'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
def main():
url='http://www.ivsky.com/bizhi/yourname_v39947/'
html=(getHtmlurl(url))
print(getpic(html))
main()
这上面的代码中有基本的网页信息获取,图片下载操作,我们主要工作就是依据网页源代码信息以及自己的个人要求编写爬取网页图片的代码。
首先点开网站,按F12观察源码信息:
定位页面中一个图片,可以看到它的在网页源码中的位置,然后我们往上面拉,看它的的路径:
需要注意一点,这个网页中每页图片中都有个我们并不需要的:
它点开之后是另一个展示一组图片的页面,所以我们要排除它的干扰:
soup =BeautifulSoup(html,'html.parser')
all_img=soup.find('p',class_='list').find('ul').find_all("a",attrs={'href':re.compile('^((?!http).)*$'),'target':'_blank'})
这里用了BeautifulSoup库,通过find_all()方法的标签属性筛选。我们对比上面两种图片链接源码的不同,可以看到我们需要的图片的a标签的href属性的值里面是没有http的,但是干扰图片中有,所以我们用一个正则来筛选href标签值中不含有http的并且target属性的值为_blank的a标签,得到的是这一页中包含我们需要链接的所有a标签信息的列表。不知道你有没有注意到,img标签中的链接看上去才是能满足我们需求的,而a标签中的链接信息还不完整,我们为什么要提取它后面会说到
用for语句提取每一条信息:
for img in all_img:
title=img['title']
if title.find(u"女") != -1:
print("不符合要求,跳过")
continue
上面是提取每个图片的名字,并对其进行筛选。因为我并不想要人物图片,经过观察,发现大多人物图片名称都包含“女”字,于是以此来进行筛选。这里可以用正则表达式,能进行更多样更细致的筛选。另外,这段语句我是放在整个循环的最前面,但是按照代码的逻辑性以及美观性是不应该放在这里的,具体原因我后面会说到。
这里回顾之前我们为什么要提取一个非图片下载链接的问题,原因就是别忘了我们是要把图片下载下来作为壁纸使用的,这就对图片的分辨率有要求。我们把鼠标放在图片对应的href上,显示的分辨率是很低的。这就是网页展示高分辨率图片使用的一种方法,套图,以此使页面浏览更快速更省流,我们为了爬取更高分辨率的图片,还需后面的操作。
我们点击此图片,会出来一个新页面,页面的链接如下:
仔细观察,会发现新的链接就是在网站链接之后加上了我们之前在a标签的href属性中提取的值
然后看页面源码,定位图片:
然而现在我们依旧不可以直接获取下载链接。我们可以看到a标签的href属性的值类似于我们在之前页面看到的值,说明后面还有更大分辨率的图片,现在图片的分辨率虽然说勉强能用,但是既然要爬,我们干脆就爬个分辨率最大的。于是和之前一样,再次点击新图片,又出来一个新的页面,链接图片我就不放了,依然和之前一样是网站链接加上href中的值。
我们这时候定位新页面上的图片源码:
好啦,现在我们就可以直接获取图片a标签中的链接信息进行下载了。
我们之前的两次跳转大致操作是类似的,我们可以将这些语句写入到新方法中:
def getimgurl(img):
href=img['href']
url="http://www.netbian.com"+href
#print(url)
htm=getHtmlurl(url)
soup=BeautifulSoup(htm,'html.parser')
return soup
注意两次对页面信息处理后的soup信息中图片链接提取的操作是不同的,这个要写在新方法外面:
soup1=getimgurl(img)
im1=soup1.find('p',id='main').find('p',class_='endpage').find('p',class_='pic').find('p').find('a')
soup2=getimgurl(im1)
im2=soup2.find('p',id='main').find('table').find('a')
提取链接:
img_url = im2['href']
print (img_url)
这里就是我们最终的链接,输出链接,便于之后的对于各个图片爬取状态的定位。然后回想开头那次按图片名称进行的筛选,我当时说放在里对代码的逻辑性和美观性有影响就是这个。按理说应该要输出每个图片的链接之后,在输出对应的爬取状态,但是因为爬取图片链接我们需要多次处理,这个需要时间,如果将筛选放在爬取链接之后,会很浪费时间,大家可以尝试一下两者在爬取多个图片的时间差距,因为我重点主要放在代码的功能而不是代码本身,所以我将筛选放在了最前面,筛选不通过这个图片直接跳过,节省时间。
单纯为了学习的,如果有筛选信息,可以放在链接之后,这样输出信息会看的很舒服。如果觉得时间太长,可以考虑多线程爬取。
然后就是自定义图片名字和路径。图片名字我们之前已经提取出来保存在title里面,网页上的图片有些名字中有空格,有些有逗号,我觉得这样看起来不太舒服,就将空格和逗号都替换掉了:
root='/home/suwex/test2/'
title=title.replace(',','|')
title=title.replace(' ','|')
path = root + title
之后图片的下载操作就是如参考代码一样。
这一切结束之后,可以发现我们只爬取了一页图片,这当然不是我们所需要的。
前方取巧警告!
回去观察最开始的网页的跳转页数后的链接信息变化,发现只需要在页面链接的index_后面加上对应的数字就行了,于是,我们在主函数中加上一个循环,循环键入链接信息:
for i in range(1,10):
if i==1:
url='http://www.netbian.com/weimei/index.htm'
else:
url='http://www.netbian.com/weimei/index_' + str(i) +'.htm'
html=(getHtmlurl(url))
print(str(i)+" : ")
print(getpic(html))
if判断是因为第一页的index后面没有数字,所以要单独拿出来操作一下。输出i值,是为了让输出信息更为明晰,也便于在爬取失败后找到对应图片查找失败原因。
这种页面跳转方式我是非常不推荐大家使用的,一般写爬虫的时候我们需要的是自动跳转,自动爬取下一步的链接。一种方式就是通过定位网页中下一页按钮的源码进行跳转:
最后,一切顺利的话完成壁纸爬取,我们可能会发现在爬取过程中有图片爬取失败了,找到这个图片,我们发现这个图片的最大分辨度是需要会员才能下载的,而我们连登陆都没有。我是直接放弃掉这几个图片的,不过会员不说,这里面涉及到的登录功能也是在大部分爬虫编写过程中不可或缺的,这也是很重要的大家要好好学习钻研。
很多东西我这个简单的爬虫代码里面都没有写到,这只是个最基本的最简单的,而且写的不太规范。主要侧重在功能上了。大家编写自己的爬虫的时候可以试着把cookie信息加上,还有一些网站的登录之类的。
以上,大家看下来的话应该有点发现了,写爬虫基本的语句技巧掌握是一方面,更不可或缺的是对你想爬取的页面的源码的分析,爬虫没有通用的,每个爬虫都是对相应页面和功能的量身定制,网上的各种代码虽好但不是你需要的,学习爬虫时,语句不熟练的话,也不要像我一样直接找个模板修改,可以比照着编写,慢慢就熟练了。
最后附上完整源码:
import requests
from bs4 import BeautifulSoup
import os
import re
def getHtmlurl(url): #获取网址
try:
r=requests.get(url)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
def getimgurl(img):
href=img['href']
url="http://www.netbian.com"+href
#print(url)
htm=getHtmlurl(url)
soup=BeautifulSoup(htm,'html.parser')
return soup
def getpic(html): #获取图片地址并下载
soup =BeautifulSoup(html,'html.parser')
all_img=soup.find('p',class_='list').find('ul').find_all("a",attrs={'href':re.compile('^((?!http).)*$'),'target':'_blank'})
for img in all_img:
title=img['title']
if title.find(u"女") != -1 :
print("不符合要求,跳过")
continue
soup1=getimgurl(img)
im1=soup1.find('p',id='main').find('p',class_='endpage').find('p',class_='pic').find('p').find('a')
soup2=getimgurl(im1)
im2=soup2.find('p',id='main').find('table').find('a')
img_url = im2['href']
print (img_url)
#root='/home/suwex/图片/'
root='/home/suwex/test2/'
title=title.replace(',','|')
title=title.replace(' ','|')
path = root + title
try: #创建或判断路径图片是否存在并下载
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(img_url)
with open(path, 'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
def main():
for i in range(1,10):
if i==1:
url='http://www.netbian.com/weimei/index.htm'
else:
url='http://www.netbian.com/weimei/index_' + str(i) +'.htm'
html=(getHtmlurl(url))
print(str(i)+" : ")
print(getpic(html))
main()
相关阅读
开网店并不难,难的是如何推广网店和提高销量。新手卖家在开店之初容易找不着北,不清楚网店的装修,店铺的推广,接触了开网店相关的每件
一、网络营销的本质是流量变现网络营销是一种营销活动,只是这种活动在网上存在的。我们在现实中的营销需要带来的是人的流量。而网
全网营销是全网整合营销的简称,指将产品规划、产品开发、网站建设、网店运营、品牌推广、产品分销等一系列电子商务内容集成于一体
随着社会的不断发展,很多人在工作方面,已经有了更多的选择,并不急于找一份工作,而是选择很多能够为自己提供生活保证的工作先兼职着,而
htt我ps://我huai88我8.我cn/?pp=我11523 去掉我就好