前几天在csdn首页看到一个大佬爬取看准网数据并分析的博客,自己搞了一下,各种问题,已超过目前的认知领域,so,先从基本的做起吧,一点点添加新内容。
本次任务为爬取马蜂窝旅行达人的游记照片,之前搞过几次马蜂窝,中间停顿过长,再次回归吧。
上代码:
import re
import urllib.request
import os
from lxml import etree
def savePhoto(soup,path):
print(u"开始保存图片")
img=soup.xpath('//img/@data-src')
total_img=0
for myimg in img:
total_img += 1
print(myimg)
urllib.request.urlretrieve(myimg,path+'%s.jpg'%total_img)
print(u"已经保存第",total_img,u"张照片")
print(u"总共保存第",total_img,u"张照片")
def getTitle(soup):
result=soup.xpath('//div/h1/text()')[0]
result=re.sub('\\n','',result)
result=re.sub('\|','',result)
print("title:"+result)
if result:
return result
else:
return None
def mkdir(path):
path=path.strip()
isExists=os.path.exists(path)
if not isExists:
print(u"创建了名为",path,u"的文件夹")
os.makedirs(path)
return True
else:
print(u"名为",path,u"的文件夹已存在")
return False
def start(html,path):
print(u"开始爬取图片")
title=getTitle(soup)
path=path+title+"\\"
mkdir(path)
savePhoto(soup,path)
print(u"请输入一个马蜂窝旅行的游记地址")
url=(input())
path="D:\Mafengwo\photo\\"
request=urllib.request.Request(url)
response=urllib.request.urlopen(url)
soup = etree.HTML(response.read().decode('utf-8'))
print(u"连接成功")
start(soup,path)
ok,总共有四个函数,保存图片,获取标题,判断文件夹是否存在以及我们的开始函数,首先我们输入想要爬取的网址,可以使用input,注意raw_input()在python3.x中已经去除了;然后设置存放照片的路径,可以提前创建文件夹也可以自动创建,这里注意一下路径,photo后边需要‘\\’,一个'\'会出错,关于路径的反斜杠问题大家可以去搜一下,我已经看晕了,印象中双反斜杠,在转义字符中用到过,还有相对绝对路径中,对于所有子文件貌似用双斜杠。。
下边的两条命令(刚才打到这里时突然发现今天是周六,然后出去给家里打了个电话,各位离家在外的游子,不要忘了每周给家里打个电话报个平安聊聊琐事~~emmmmm,不煽情了),访问网站最常用的命令,其实这里有点怪,urlopen(url)中的url应该替换为request,即前一条命令返回的结果,事实上这两种方式都行。。最后用etree.HTML()解析得到的html文档,处理之。
对于这四个函数,大部分都是常规操作,使用xpath时注意一下文档格式即可,一般大问题没有小毛病一大堆,先看下所爬取页面的结构吧:
这里有好几个src,其实都是对应的同一张图片,只是尺寸不一样,这个大家点开就知道了,一个是在上边的href页面显示的照片,一个是原图。我们抓取的是data-src的内容,常规尺寸,正合适。。
在抓取标题时注意一下命名规则,用到了re.sub()方法,替换掉一些文件名不支持的特殊字符,不然会报错。
关于几个常用方法大家可以总结一下,如urllib.request系列的,都很好用~~
我们选取的是马蜂窝旅行首页的几位达人的游记:
看下ipython操作的过程:
这里大家注意到在“请输入一个马蜂窝旅行的游记地址”下边是有个空行的,因为print方法末尾自动换行,看下原型print('contents', end='!@#$%^&*'),其end属性默认值为‘\n’,即换行,我们可以修改一下:print(u"请输入一个马蜂窝旅行的游记地址",end=''),这样就不会有空行了:
最后看下最终效果:
我们一共爬取了五个达人的游记照片,看下第一个:
ok,大概就是这样,稍后使用这些图片搞一点好玩的事情……