代码改变世界

windows批处理执行图片爬取脚本

2021-09-11 22:04  第二个卿老师  阅读(363)  评论(0编辑  收藏  举报

 背景

由于测试时需要上传一些图片,而自己保存的图片很少。

为了让测试数据看起来不那么重复,所以网上找了一个爬虫脚本,以下是源码:

 1 import requests
 2 import os
 3 
 4 class Image():
 5     url = 'https://image.baidu.com/search/acjson'
 6     headers = {
 7         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'
 8     }
 9     varlist = []
10     dir = './images'
11     params = {}
12 
13     def __init__(self):
14         global page_num,keywords
15         page_num = int(input('请输入要抓取的页数:\n'))
16         keywords = input('请输入关键字:\n')
17         if self.catch_page():
18             self.writeData()
19         else:
20             print('抓取页面失败')
21 
22     def catch_page(self):
23         for i in range(0,page_num * 30,30):
24             self.params = {
25                 'tn': 'resultjson_com',
26                 'ipn': 'rj',
27                 'ct': '201326592',
28                 'is': '',
29                 'fp': 'result',
30                 'queryWord': keywords,
31                 'cl': '2',
32                 'lm': '-1',
33                 'ie': 'utf-8',
34                 'oe': 'utf-8',
35                 'adpicid': '',
36                 'st': '-1',
37                 'z': '',
38                 'ic': '0',
39                 'hd': '',
40                 'latest': '',
41                 'copyright': '',
42                 'word': keywords,
43                 's': '',
44                 'se': '',
45                 'tab': '',
46                 'width': '',
47                 'height': '',
48                 'face': '0',
49                 'istype': '2',
50                 'qc': '',
51                 'nc': '1',
52                 'fr': '',
53                 'expermode': '',
54                 'force': '',
55                 'cg': 'girl',
56                 'pn': i,
57                 'rn': '30',
58                 'gsm': '',
59                 '1584010126096': ''
60             }
61             res = requests.get(url = self.url,params = self.params).json()['data']
62             for j in range(0,30):
63                 self.varlist.append(res[j]['thumbURL'])
64         if self.varlist != None:
65             return True
66         return False
67 
68     def writeData(self):
69         # 判读是否存在文件,不存在则创建
70         if not os.path.exists(self.dir):
71             os.mkdir(self.dir)
72 
73         for i in range(0,page_num * 30):
74             print(f'正在下载第{i}条数据')
75             images = requests.get(url = self.varlist[i])
76             open(f'./images/{i}.jpg','wb').write(images.content)
77 
78 if __name__ == '__main__':
79     Image()
View Code

这代码可能作者跑当时ok,但我跑失败了(报错:requests.exceptions.TooManyRedirects: Exceeded 30 redirects.),排查了一下,请求时加上headers参数就ok了。

图片是保存到当前路径下的,要是把图片存储换一个目录,就需要移动这个爬虫文件,当然你也可以改代码里面的路径,但是换一次路径就改下代码?感觉不太优雅。

那能不能写个window的批处理脚本(xxx.bat),py文件不动,你要换那个目录就把.bat文件放在那个目录里,py文件就放一个地方不用动。

解决方案

首先,这方法肯定是可行的

其次,我得确认py文件的路径

接着,我可以执行这个py文件

然后,执行的时候把当前.bat路径传给py文件

最后,在py代码里把图片保存在传入的路径下

大功告成!.bat文件内容如下:

1 @echo off
2 rem 这里的D:和D:\Python 是Python文件所在的盘及路径
3 D:
4 cd D:\spider
5 
6 echo  当前路径:%~dp0
7 python drink_pic.py %~dp0
8 pause
9 exit

其中:

  • %cd%代表的是当前工作目录(current working directory,variable);
  • %~dp0代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)

以下是修改后图片爬虫py源码:

  1 import argparse
  2 
  3 import requests
  4 import os
  5 import sys
  6 
  7 class Image():
  8     url = 'https://image.baidu.com/search/acjson'
  9     headers = {
 10         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36',
 11         'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
 12         'Accept-Encoding':'gzip, deflate',
 13         'Accept-Language':'zh-CN,zh;q=0.9',
 14         'Connection':'keep-alive',
 15         'Cookie':'BDqhfp=%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95logo%26%26NaN-1undefined-1undefined%26%262928%26%266; BAIDUID=50559E09CC89BCB4A35AE534A4AFBD93:FG=1; PSTM=1613793192; BIDUPSID=994A62B2BBC179C9D5FDDD4576FD1138; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; __yjs_duid=1_b93b073db4b3095e4b6ca8bdad9666671613879345923; H_PS_PSSID=33512_33241_33257_33344_31254_33601_33585_26350_33264; delPer=0; PSINO=5; ZD_ENTRY=baidu; BA_HECTOR=2081a48k040k852hlm1g3c5g40r; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; userFrom=www.baidu.com; indexPageSugList=%5B%22%E9%85%92%22%5D; cleanHistoryStatus=0',
 16         'Host':'image.baidu.com',
 17         'Referer':'https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E9%85%92',
 18         'Upgrade-Insecure-Requests':'1',
 19         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
 20     }
 21     varlist = []
 22     dir = './images'
 23     params = {}
 24 
 25     def __init__(self, pt):
 26         global page_num,keywords
 27         page_num = int(input('请输入要抓取的页数:\n'))
 28         keywords = input('请输入关键字:\n')
 29         if self.catch_page():
 30             self.writeData(pt)
 31         else:
 32             print('抓取页面失败')
 33 
 34     def catch_page(self):
 35         for i in range(0,page_num * 30,30):
 36             self.params = {
 37                 'tn': 'resultjson_com',
 38                 'ipn': 'rj',
 39                 'ct': '201326592',
 40                 'is': '',
 41                 'fp': 'result',
 42                 'queryWord': keywords,
 43                 'cl': '2',
 44                 'lm': '-1',
 45                 'ie': 'utf-8',
 46                 'oe': 'utf-8',
 47                 'adpicid': '',
 48                 'st': '-1',
 49                 'z': '',
 50                 'ic': '0',
 51                 'hd': '',
 52                 'latest': '',
 53                 'copyright': '',
 54                 'word': keywords,
 55                 's': '',
 56                 'se': '',
 57                 'tab': '',
 58                 'width': '',
 59                 'height': '',
 60                 'face': '0',
 61                 'istype': '2',
 62                 'qc': '',
 63                 'nc': '1',
 64                 'fr': '',
 65                 'expermode': '',
 66                 'force': '',
 67                 'cg': 'girl',
 68                 'pn': i,
 69                 'rn': '30',
 70                 'gsm': '',
 71                 '1584010126096': ''
 72             }
 73             res = requests.get(url = self.url,headers = self.headers, params = self.params).json()['data']
 74             print("---------res=", res)
 75             for j in range(0,30):
 76                 self.varlist.append(res[j]['thumbURL'])
 77         if self.varlist != None:
 78             print(self.varlist)
 79             return True
 80         return False
 81 
 82     def writeData(self, pt):
 83         # 判读是否存在文件,不存在则创建
 84         pt = pt + 'images/'
 85         if not os.path.exists(pt):
 86             os.mkdir(pt)
 87         print(pt)
 88         for i in range(0,page_num * 30):
 89             print(f'正在下载第{i}条数据')
 90             images_data = requests.get(self.varlist[i])
 91             images_content = images_data.content
 92             open(pt + f'{i}.jpg','wb').write(images_content)
 93 
 94 if __name__ == '__main__':
 95     # sys.argv[1]这里代表接受CMD传入的第一个参数,如果传多个参数命令后以空格隔开
 96     print("入参[1]为:", sys.argv[1])
 97     pt = sys.argv[1]
 98     # pt = 'E:/图片视频/'
 99     pt1 = pt.replace('\\', '/')
100     print('path',pt1)
101     im= Image(pt1)
View Code