Python-爬取图片

前言

明天要去考全国大英比赛,在寝室里百度了一份模拟题,无奈找不到pdf版,网页浏览又不想看广告,于是就想到了用爬虫把图片爬下来,然后去复印一份 。结果上午一道题也没做:)

00x00 关于三个模块

代码实现主要使用了requests,re,bs4.BeautifulSoup这三个模块,如果你也和我一样有一些迷惑的话可以看我的这篇文章 Python-常用库学习

这三个模块应该是比较好上手的,这里就不多赘述了。

00x01 代码实现

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
import requests
import re
import bs4
target = "http://www.chinaneccs.org/nd.jsp?id=222"
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
'Referer': 'http://www.chinaneccs.org/col.jsp?id=120',
'Host': 'www.chinaneccs.org',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection': 'close'}
cookie = {'cliid': '8pPYfGR2H1ndh9Y3',
'UM_distinctid': '16a1443ead0170-0ef3173ce98735-4c312c7c-144000-16a1443ead2135',
'CNZZDATA1256914139': '832191563-1555116204-%7C1555116204',
'_siteStatId': 'd87a7e78-dc53-4647-a9a9-fedbd9b4cfed',
'_siteStatDay': '20190413',
'_siteStatRedirectUv': 'redirectUv_7329982',
'_siteStatVisitorType': 'visitorType_7329982',
'_siteStatVisit': 'visit_7329982',
'_siteStatVisitTime': '1555118168334',
'_siteStatReVisit': 'reVisit_7329982',
'_lastEnterDay': '2019-04-13',
'_loginBeforeFiveMin': 'true'}

req = requests.get(url=target, headers=header, cookies=cookie)
req.encoding = 'utf-8'
html = req.text # 获取目标url的源码
file_name_list = re.findall(r'c.?\d\.jpg', html) # 获取图片名字,便于保存
file_name_list.append('no_use.jpg') # 这里是没有过滤干净,在抓标签的时候多了一个,于是多加一个名字
bf = bs4.BeautifulSoup(html)
tags = bf.find_all('img') # 获取img标签

i = 0
for t in tags:
"""遍历保存"""
r = re.search(r'"//(.*?)"', str(t))
u = "http:" + eval(r.group())
res = requests.get(url=u)
f = open('C:/Users/Sketch Plane/Desktop/exam_pictures/' + file_name_list[i], 'wb')
f.write(res.content) # 注意使用res.content而不是res.text
f.close()
i += 1

00x02 注意事项

  • 需要伪造一下header头和cookie,否则提示非法访问…
  • 获取的源码需要encoding编码成 utf-8 来防止中文乱码,当然有时候是其他编码,如GBK
  • 以二进制形式保存文件的话,f.write()需要使用res.content而不是res.text

小结

之前已经练习过爬取小说,所以说静态的图片爬取就轻车熟路了,不过代码实现貌似有点垃圾…感觉可以优化,不过还是先去写英语八:)

SkrSkr

0%