粗劣爬虫

起因是因为在linux下装了variety之后,看到的壁纸都有些接受不了,所以想着爬些图片回来做个壁纸。


demo

先拿自己blog试手,虽然说好久没有这么正经的写个东西(blog的构造极为简单)。
在这个过程,就有只仔来嘲讽我了,这么简单的东西写来干嘛。大佬就是大佬。

查看URL结构:http://rcoil.me/page/2/

1
2
3
主体为:http://rcoil.me/page/2/
type为:page
参数为:2

先列URL:

1
2
3
4
5
6
7
8
9
10
11
12
for i in xrange(1, 6):
if i == 1:
url = 'http://rcoil.me/'
else:
url = 'http://rcoil.me/page/%d/' % i
print url
打印结果为:
http://rcoil.me/
http://rcoil.me/page/2/
http://rcoil.me/page/3/
http://rcoil.me/page/4/
http://rcoil.me/page/5/

解析内容

1
2
3
4
5
6
7
8
9
10
11
12
# 异常处理
try:
#使用 requests.get 来从web页面中取得我们的数据,通过使用 html 模块解析它,并将结果保存到 paperlink 中
response = requests.get(url, timeout=10)
except Exception as e:
print e
else:
paperlink = html.fromstring(response.text)
#使用XPath在XML文档中查找所需要的链接,并将结果存入paperlist中
paperlist = paperlink.xpath('//main[@class="main"]/div/div/div/section/article/link/@href')
#使用extend追加数据
paperlists.extend(paperlist)

结果

效果为:

获取了URL地址后,就可以去找个站点试一下。

彼岸桌面

在首页看到了分类,先摸清楚要爬什么类型的壁纸,继续看URL(选择了动漫分类)
查看结构:http://www.netbian.com/dongman/index_2.htm

1
2
3
主体为:http://www.netbian.com/
type为:dongman
参数为:index_2.htm(数字代表页数)

基础的编写与上面的一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def ImageList():
toImageList = []
for i in xrange(1, 20):
if i == 1:
url = 'http://www.netbian.com/dongman/index.htm'
else:
url = 'http://www.netbian.com/dongman/index_%d.htm' % i
# 异常处理
try:
response = requests.get(url, timeout=10)
except Exception as e:
print e
else:
paperlink = html.fromstring(response.text)
title = paperlink.xpath('//div[@class="list"]/ul/li/a/@title')
imagelist = paperlink.xpath('//div[@class="list"]/ul/li/a/img/@src')
print imagelist

得到的jpg图片链接,进行访问,发现图片太小了。再次查看网页及xml。发现有个尺寸的选项。
尺寸选项进去,随机点击一张图片。发现图片上面有个下载链接;

URL链接为:http://www.netbian.com/desk/19336.htm
图片上的下载链接为:http://www.netbian.com/desk/19336-1920x1080.htm
很明显,我们需要的链接是图片上的下载链接
那就更改下xpath的信息。

  • 读取desk地址的信息
  • 重组desk地址
  • 插入尺寸大小到URL
  • 获取照片的最后链接
  • 下载jpg并以图片名命名
    1
    2
    3
    4
    5
    6
    display = '-1920x1080.htm'
    DeskList = PaperLink.xpath('//div[@class="list"]/ul/li/a/@href')
    #重组desk地址
    for desklist in DeskList:
    desklist = desklist.replace('.htm', '')+display
    DeskUrl = 'http://www.netbian.com'+ desklist

最后代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/env python 2.7
# -*- coding: utf-8 -*-
import requests
from lxml import html
display = '-1920x1080.htm' #图片尺寸1920x1080
types = 'dongman' # 分类情况
page = 12 #页数
# 获取desk链接
def DeskUrl():
toDeskUrl = []
for i in xrange(1, page+1):
if i == 1:
URL = 'http://www.netbian.com/'+types+'/index.htm'
else:
URL = 'http://www.netbian.com/'+types+'/index_%d.htm' % i
# 异常处理
try:
# 使用 requests.get 来从web页面中取得我们的数据,通过使用 html 模块解析它,并将结果保存到 paperlink 中
response = requests.get(URL, timeout=10)
#print response.text
except Exception as e:
print e
else:
PaperLink = html.fromstring(response.text)
# 使用XPath在XML文档中查找所需要的链接,并将结果存入paperlist中
DeskList = PaperLink.xpath('//div[@class="list"]/ul/li/a/@href')
toDeskUrl.extend(DeskList)
return toDeskUrl
# 获取图片链接
def ImageList():
toImageList = []
# 重组desk地址
for desklist in DeskUrl():
desklists = desklist.replace('.htm', '')+display
deskurl = 'http://www.netbian.com'+ desklists
# 获取所需格式图片的URL链接
try:
response = requests.get(deskurl, timeout=10)
except Exception as e:
print e
else:
imagelink = html.fromstring(response.text)
title = imagelink.xpath('//td[@align="left"]/img/@title')
imageurl = imagelink.xpath('//td[@align="left"]/img/@src')
toImageList.extend(imageurl)
return toImageList
def ImageDown():
cnt = 0
for image_url in ImageList():
cnt += 1
# 图片名
image_name=(image_url.split('/')[-1]).split('.')[-2]+".jpg"
try:
if image_url:
re1 = requests.get(image_url, timeout=10).content
else:
continue
except Exception as e:
raise
else:
# 以二进制的形式写入
print u'正在下载[ %s ]类第[ %.3d ]张壁纸!' % (types, cnt)
with open(image_name, 'wb') as imgfile:
imgfile.write(re1)
if __name__ == '__main__':
ImageDown()

效果为:
ImageDown

如果需要以标题给图片命名的话直接引用ImageList内的title就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def ImageList():
toImageList = []
toTitleList = []
....
imagelink = html.fromstring(response.text)
title = imagelink.xpath('//td[@align="left"]/img/@title')
toTitleList.extend(title)
imageurl = imagelink.xpath('//td[@align="left"]/img/@src')
toImageList.extend(imageurl)
return toImageList,toTitleList
def ImageDown():
cnt = 0
name = 0
for image_url in ImageList()[0]:
image_name = ImageList()[1][name]+'.jpg'
cnt += 1
name +=1
....

!坚持技术分享,您的支持将鼓励我继续创作!