python网络数据抓取二(bing图片抓取)

Posted 水墨的心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python网络数据抓取二(bing图片抓取)相关的知识,希望对你有一定的参考价值。

  上一回尝试抓取了百度热点数据,这次继续选择利用bing搜索抓取图片练习下,代码放在最下供大家参考。程序需要传入三个参数,图片关键词、图片保存路径、需要抓取的数量。运行过程中可能会有一些错误(大部分的是网络错误,比如超时等)我这里捕获到只打印出来然后跳过。代码中翻页的url请求是抓包获取到的(没有写全,有几个参数不知道什么意思去掉了..),然后就是分析返回的html提取想要的数据。下面是我运行的一次结果供参考:

 结果:

源码:

 1 # -*- coding: UTF-8 -*-
 2 
 3 from bs4 import BeautifulSoup
 4 import urllib.request
 5 import requests
 6 import time
 7 import json
 8 import sys
 9 import re
10 import os
11 
12 
13 #爬取目标网站url
14 CRAWL_TARGET_URL = \'https://cn.bing.com/images/async?q=%s&first=%d&count=%d&relp=%d&lostate=r&mmasync=1\'
15 
16 #每次抓取图片数量(35是此网页每次翻页请求数量)
17 NUMS_PER_CRAWL = 35
18 
19 #抓取图片最小大小(单位字节),小于此值抛弃
20 MIN_IMAGE_SIZE = 50000
21 
22 
23 def get_image(url, path, count):
24     try:
25         u = urllib.request.urlopen(url, timeout=5)
26         t = u.read()
27         if sys.getsizeof(t) < MIN_IMAGE_SIZE:
28             return -1
29     except Exception as e:
30         print(url, e)
31         return -2
32     #提取图片格式
33     frmt = url[url.rfind(\'.\'):]
34     p = re.compile("^\\\\.[a-zA-Z]+")
35     m = p.match(frmt)
36     frmt = m.group(0)
37     try:
38         f = open(os.path.join(path, str(count)+frmt), \'wb\')
39         f.write(t)
40         f.close()
41     except Exception as e:
42         print(os.path.join(path, str(count)+frmt), e)
43         return -3
44     return 0
45 
46 
47 def crawl_data(info, path, num):
48     first = 0
49     count = 0
50     #创建一个会话
51     s = requests.Session()
52     while(count < num):
53         u = CRAWL_TARGET_URL%(info, first, NUMS_PER_CRAWL, NUMS_PER_CRAWL)
54         #3.05s为发送超时时间,10s为接收到数据超时时间
55         req = s.get(url =u, timeout=(3.05, 10))
56         bf = BeautifulSoup(req.text, "html.parser")
57         imgtags = bf.find_all("a", class_ = "iusc")
58         for e in imgtags:
59             if count == num:
60                 return
61             urldict = json.loads(e.get(\'m\'))
62             if get_image(urldict["murl"], path, count) < 0:
63                 continue
64             print("第%d张图片下载完成,总进度%d%%"%(count+1, (count+1)*100/num))
65             sys.stdout.flush()
66             count =count+1
67             time.sleep(0.01)
68         first = first + NUMS_PER_CRAWL
69         time.sleep(0.1)
70 
71 
72 \'\'\'
73     参数1:搜索关键词
74     参数2:图片存放路径
75     参数3:抓取数量
76 \'\'\'
77 if __name__ == \'__main__\':
78     tstart = time.time()
79     crawl_data(sys.argv[1], sys.argv[2], int(sys.argv[3]))
80     print("所有图片下载完毕,总用时%.2fs"%(time.time()-tstart))

 

以上是关于python网络数据抓取二(bing图片抓取)的主要内容,如果未能解决你的问题,请参考以下文章

python图像刮刀,在bing上无法正常工作

PHP使用PHP抓取Bing每日图像并为己所用

一篇文章教会你利用Python网络爬虫抓取百度贴吧评论区图片和视频

java爬虫抓取指定数据

我想用python抓取网页里的图片,地址,商铺名,电话号码,怎么写代码

[Python爬虫] 之二十六:Selenium +phantomjs 利用 pyquery抓取智能电视网站图片信息