一只爬虫

重新学习python,写了一个爬煎蛋无聊图的爬虫。

这里用的是python3。python3把urllib和urllib2合并成了urllib,对于我这种喜欢吹毛求疵的人来说简直是再好不过了。

其间遇到了一个异常bad character range,放狗一搜,看到stackoverflow上说正则表达式写错了,我改了半天正则表达式,还是不能正确运行。最后知道真相我的眼泪掉下来,我把re.findall的两个参数传反了。

另外,由于图片的格式有很多种,我使用<img src="(.*\.(?:jpg|jpeg|gif))"来匹配,其中(?:exp)的语法表示不捕获匹配到的内容,仅仅用来限制|的作用范围。

下面是代码

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
import os
import urllib.request
import socket
import re

def get_img_url(page_url):
socket.setdefaulttimeout(20) # 设置超时时间
imgs = []
try:
content_in_bytes = urllib.request.urlopen(page_url).read()
content = str(content_in_bytes.decode('utf-8'))
pattern = r'<img src="(.*\.(?:jpg|jpeg|gif))"'
imgs = re.findall(pattern, content)
except Exception as e:
print("parse content failed %r" % str(e))
return imgs

def download_img(url, save_path):
# 从URL中获取文件名
filename = url.split("/")[-1]
try:
urllib.request.urlretrieve(url, save_path + filename, None)
print("download succeeded")
except Exception as e:
print("download failed %r" % str(e))

def jandan_xxoo(folder_path, page_no):
print("page ", page_no)
url = r"http://jandan.net/pic/page-" + str(page_no) + '#comments'
path = folderpath + str(page_no) + '\\'
if os.path.exists(path):
print("page already downloaded")
return
else:
os.mkdir(path)
imgs = get_img_url(url)
for img in imgs:
download_img(img, path)

if __name__ == "__main__":
folderpath= "E:\\study\\py\\img\\jandan\\"
page_no = 3945 # 从3945页开始下载
for i in range(0, 30): # 一共下载30页
jandan_xxoo(folderpath, page_no - i)

代码比较丑陋,有空还是得去看看PEP8,一个python的代码规范。

既然你都已经看到了这里,估计你也想到了,把url里面的pic换成ooxx就可以批量下载妹子图了。不用谢。

给鸡排饭加个蛋