<blockquote>事前声明:不知道写代码用到别人的图片主页什么的算不算侵权,如果本人不同意我立马删除</blockquote>上一次(算是)解决了大侄子的下载问题之后,我们弹冠相庆,然后陷入了深深的沉思:
<blockquote>
咱们下一步干什么?
</blockquote>经过慎重的思考,我锁定了<a href = "http://www.lofter.com/">lofter</a>,单纯的因为lofter达人很多,而且图片质量很高,大家乐于分享,图片也很有艺术性,绝对不知道lofter涉黄的事儿。
首先,找到一个比较适合抓取的个人主页,我在我自己的关注中找到了她:牛泽萌<code>http://niuzemeng.lofter.com/</code>
照片不多,也不用翻页,标签里面的相同标志也很好找,而且之前就写了一个爬取下载链接的爬虫了,所以写起来还算得心应手。
就是遇到一个问题:我用bs+urllib的方式偶尔程序会运行不下去,卡在<code>read()</code>这儿了,但是我发送给我好几个朋友却都能正常运行,实在没搞明白,直接用requests+bs写了一个:
<code>import re
import requests
import bs4
Url = "http://niuzemeng.lofter.com"
page = requests.get(Url)
soup = bs4.BeautifulSoup(page.text,"html.parser")
imgUrlArr = soup.find_all("img",attrs={'src':re.compile("nosdn.127.net")}
print imgUrlArr
</code>
写完之后本来想用requests接着写下载好了,但是自己实在太懒,又import一个urllib,直接用<code>urllib.urlretrieve()</code>一句话写好了,两个参数,一个是下载链接,一个是路径:
所以代码又变成了这个样子:
<code># -- coding: UTF-8 --
import re
import requests
import bs4
import urllib
Url = "http://niuzemeng.lofter.com"
page = requests.get(Url)
soup = bs4.BeautifulSoup(page.text,"html.parser")
name = "牛泽萌"
imgUrlArr = soup.find_all("img",attrs={'src':re.compile("nosdn.127.net")})
for index, imgUrl in enumerate(imgUrlArr):
Furl = re.sub( '(?imageView).*', '', imgUrl['src'])
imgName = name + str(index) + '.jpg'
urllib.urlretrieve(Furl,imgName)
print imgName</code>
这样会在程序所在的文件夹下直接创建图片名称并下载
但是这样有几个小问题,name="牛泽萌"是我直接赋值的,这样肯定不行;另外图片的后缀也是我强行命名为.jpg,这样更不行了,所以我又写了点:
<code>import urllib
from bs4 import BeautifulSoup
import re
url="http://niuzemeng.lofter.com"
soup = BeautifulSoup(urllib.urlopen(url).read(),'html.parser')
def get_img_url_arr():
img_url_arr = soup.find_all('img',attrs={'src':re.compile('nosdn.127.net')})
return img_url_arr
def get_username()
user_name = soup.title.get_text()
return user_name
def dowload_img(user_name,img_url_arr):
for index,img_url in enumerate(img_url_arr):
user_suffix = re.sub('.*(type=)','',img_url['src'])
file_name = str(user_name) + str(index) + '.' + user_suffix
print file_name
urllib.urlretrieve(img_url['src'],file_name)
if name == 'main':
dowload_img(get_username(),get_img_url_arr())</code>
给大侄子看了之后,大侄子问我 name == 'main'是干什么用的?
其实简单的理解就行,就是如果这个文件是用户运行的文件,才会去执行下面的方法,如果不是,可能会被别的py文件调用里面的方法。
虽然代码写的很烂,但是我们还是沉溺其中,既然图片咱们会爬了,再找一个让大侄子练一练?
请看下一天的日记 草榴社区1024爬虫的坑
网友评论