当前位置: 首页 > Web前端 > HTML5

Python爬虫入门教程6-100蜂鸟的图片爬虫之一

时间:2023-04-05 00:45:28 HTML5

1.蜂鸟形象介绍国庆长假结束,新的工作又开始了。今天我们继续爬取一个网站,这个网站是http://image.fengniao.com/,Hummingbird是一个大摄影师云集的地方。本教程仅供学习使用,请勿用于商业用途。毫不奇怪,蜂鸟是一个受版权保护的网站。2、分析Hummingbird.com图片网站的第一步是分析要抓取的网站是否有抓取方式。打开页面找到子页面http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=0&page=1¬_in_id=5352384,5352410http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=0&page=2¬_in_id=5352384,5352410http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=0&page=3¬_in_id=5352384,5352410http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=0&page=4¬_in_id=5352384,5352410上面的页面找到了一个关键参数page=1也就是页码,但是还有一个比较麻烦的问题就是没有最后页码,所以我们没法判断循环次数,所以在下面的代码编写中,我们只能使用while。该地址返回JSON格式的数据。对于爬虫来说,非常友好!对于省份,我们用正则表达式来分析。分析该页面的头文件,查看是否有反爬措施。发现除了HOST和User-Agent,没有什么特别的地方。大网站任性,没有反爬。第二步,分析图片详情页。在我们上面获取的JSON中,找到关键地址。关键地址打开后,这个地方有一个取巧的操作。上图标注的网址没选好,恰好是一篇文章结束,我们要的是组图,提供新链接http://image.fengniao.com/slide/535/5352130_1.html#p=1打开页面,可能直接去找规律,找到下面一堆链接,不过这个操作有点复杂。我们查看上面页面的源码http://image.fengniao.com/slide/535/5352130_1.html#p=1http://image.fengniao.com/slide/535/5352130_1.html#p=2http://image.fengniao.com/slide/535/5352130_1.html#p=3....在网页源码中找到的。我们来大胆猜测一下这样的区域。这应该是图片的json只是用H??TML打印出来的,我们只需要用正则表达式匹配一下,匹配好之后就可以下载了。第三步开始编码。3.写蜂鸟图片的代码fromhttp_helpimportR#这个文件自己在之前的博客里找,或者去github上找产品(threading.Thread):def__init__(self):threading.Thread.__init__(self)self.__headers={"Referer":"http://image.fengniao.com/","Host":"image.fengniao.com","X-Requested-With":"XMLHttpRequest"}#链接模板self.__start="http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=0&page={}¬_in_id={}"self.__res=R(headers=self.__headers)defrun(self):#因为不知道循环次数,所以用whileloopindex=2#设置起始页码为1not_in="5352384,5352410"whileTrue:url=self.__start.format(index,not_in)print("开始操作:{}".format(url))index+=1content=self.__res.get_content(url,字符et="gbk")ifcontentisNone:print("Thedatamaybegone====")continuetime.sleep(3)#sleepfor3secondsjson_content=json.loads(content)ifjson_content["status"]==1:foriteminjson_content["data"]:title=item["title"]child_url=item["url"]#获取链接后img_content=self.__res.get_content(child_url,charset="gbk")pattern=re.compile('"pic_url_1920_b":"(.*?)"')imgs_json=pattern.findall(img_content)iflen(imgs_json)>0:ifimgs_lock.acquire():img_list.append({"title":title,"urls":imgs_json})#这个地方,我用的是字典+列表的方式,主要是后面生成文件夹,可以修改上面的链接imgs_lock.release()已经生成了,下面是下载图片,很简单#ConsumerclassConsumer(threading.Thread):def__init__(self):threading.Thread.__init__(self)self.__res=R()defrun(self):whileTrue:iflen(img_list)<=0:continue#进入下一个循环ifimgs_lock.acquire():data=img_list[0]delimg_list[0]#删除第一项imgs_lock.release()urls=[url.replace("\\","")forurlindata["urls"]]#为item_urlinurls创建一个文件目录:try:file=self.__res.get_file(item_url)#记得先在项目根目录下创建fengniaos文件夹open("./fengniaos/{}".format(str(time.time())+".jpg"),"wb+")asf:f.write(file)exceptExceptionase:print(e)代码开始和结果