百度图库关键字爬虫脚本
本章设计了一个基于Python的爬虫模块,可以根据用户自定义的关键词、待爬取图片数量,自动从百度图库中采集并依次保存图片数据。
功能设计与分析
本模块为之后的模型训练提供数据集,属于数据采集部分。本模块的功能应解决以下问题:
- 目标网站的图片数量足够多,车辆种类涵盖基本种类,且爬取难度不宜过高。 综合分析可知,百度图库能满足以上要求。所以采用百度图库为目标爬取网站。
- 爬虫模块应能根据不同输入的危险车辆类别,爬取不同种类的车辆图片,所以要求爬虫模块能根据不同的车辆类别名称采集图片
- 爬虫模块应该能够根据用户指定的数目采集图片,并依次编号分类
Python语言爬虫相关库
OS
库 用于文件处理
Re
库 正则表达式库,用于解析网页结构、以及网址后缀前缀
Json
库 json文本格式库,用于处理返回的网页
Socket
库 处理网络连接超时问题
Request
库 网络请求库,用于请求网页、存储图片库
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
import os import re
import json import socket import urllib.request import urllib.parse import urllib.error
import time
timeout = 8 socket.setdefaulttimeout(timeout)
class Crawler: __time_sleep = 0.1 __amount = 0 __start_amount = 0 __counter = 0 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
def __init__(self, t=0.1): self.time_sleep = t
def get_suffix(self, name): m = re.search(r'\.[^\.]*$', name) if m.group(0) and len(m.group(0)) <= 5: return m.group(0) else: return '.jpeg'
def get_referrer(self, url): par = urllib.parse.urlparse(url) if par.scheme: return par.scheme + '://' + par.netloc else: return par.netloc
def save_image(self, rsp_data, word): if not os.path.exists("./" + word): os.mkdir("./" + word) self.__counter = len(os.listdir('./' + word)) + 1 for image_info in rsp_data['imgs']:
try: time.sleep(self.time_sleep) suffix = self.get_suffix(image_info['objURL']) refer = self.get_referrer(image_info['objURL']) opener = urllib.request.build_opener() opener.addheaders = [ ('User-agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0'), ('Referer', refer) ] urllib.request.install_opener(opener) urllib.request.urlretrieve(image_info['objURL'], './' + word + '/' + str(self.__counter) + str(suffix)) except urllib.error.HTTPError as urllib_err: print(urllib_err) continue except Exception as err: time.sleep(1) print(err) print("产生未知错误,放弃保存") continue else: print("图+1,已有" + str(self.__counter) + "张小图") self.__counter += 1 return
def get_images(self, word='iron man'): search = urllib.parse.quote(word) pn = self.__start_amount while pn < self.__amount: url = 'http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=' + search + '&cg=girl&pn=' + str( pn) + '&rn=60&itg=0&z=0&fr=&width=&height=&lm=-1&ic=0&s=0&st=-1&gsm=1e0000001e' try: time.sleep(self.time_sleep) req = urllib.request.Request(url=url, headers=self.headers) page = urllib.request.urlopen(req) print(page) rsp = page.read().decode('unicode_escape') except UnicodeDecodeError as e: print(e) print('-----UnicodeDecodeErrorurl:', url) except urllib.error.URLError as e: print(e) print("-----urlErrorurl:", url) except socket.timeout as e: print(e) print("-----socket timout:", url) else: rsp_data = json.loads(rsp) self.save_image(rsp_data, word) print("下载下一页") pn += 60 finally: page.close() print("下载任务结束") return def start(self, word, spider_page_num=1, start_page=1): """ 爬虫入口 :param word: 抓取的关键词 :param spider_page_num: 需要抓取数据页数 总抓取图片数量为 页数x60 :param start_page:起始页数 :return: """ self.__start_amount = (start_page - 1) * 60 self.__amount = spider_page_num * 60 + self.__start_amount self.get_images(word)
if __name__ == '__main__': crawler = Crawler(0.05)
crawler.start('uestc', 1, 1)
|