制作解析网址的get

  1. def gethtml(url,postdata):
  2.  
  3. header = {'User-Agent':
  4. 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0',
  5. 'Referer':
  6. 'http://image.baidu.com',
  7. 'Host': 'image.baidu.com',
  8. 'Accept': 'text/plain, */*; q=0.01',
  9. 'Accept-Encoding':'gzip, deflate',
  10. 'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
  11. 'Connection':'keep-alive'}
  12.  
  13. # 解析网页
  14. html_bytes = requests.get(url, headers=header,params = postdata)
  15.  
  16. return html_bytes

头部的构造请参考上一篇博文:

python3抓取异步百度瀑布流动态图片(一)查找post并伪装头方法

分析网址:

  1. http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=gif&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=gif&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=30&rn=30&gsm=1e&1472364207674=

分解为:

  1. url = 'http://image.baidu.com/search/acjson?' + postdata + lasturl

lasturl为时间戳,精确到后三位小数的时间戳,构造这个时间戳,后三位小数我就随机生成一个三位数了:

  1. import time
  2. import random
  3. timerandom = random.randint(100,999)
  4. nowtime = int(time.time())
  5. lasturl = str(nowtime) + str(timerandom) + '='

最后制作postdata:

  1. # 构造post
  2. postdata = {
  3. 'tn':'resultjson_com',
  4. 'ipn':'rj',
  5. 'ct':201326592,
  6. 'is':'',
  7. 'fp':'result',
  8. 'queryWord': keyword,
  9. 'cl': 2,
  10. 'lm': -1,
  11. 'ie': 'utf-8',
  12. 'oe': 'utf-8',
  13. 'adpicid': '',
  14. 'st': -1,
  15. 'z':'',
  16. 'ic': 0,
  17. 'word': keyword,
  18. 's': '',
  19. 'se': '',
  20. 'tab': '',
  21. 'width': '',
  22. 'height': '',
  23. 'face': 0,
  24. 'istype': 2,
  25. 'qc': '',
  26. 'nc': 1,
  27. 'fr': '',
  28. 'pn': pn,
  29. 'rn': 30,
  30. 'gsm': '1e'
  31. }

其中页数pn和搜索关键字keywork为:

  1. # 搜索的关键字
  2. # keywork = input('请输入你要查找的关键字')
  3. keyword = 'gif'
  4.  
  5. # 页数
  6. # pn = int(input('你要抓取多少页:'))
  7. pn = 30

将得到的信息保存在本地,当所有都保存下来了再去下载图片:

  1. # 解析网址
  2. contents = gethtml(url,postdata)
  3.  
  4. # 将文件以json的格式保存在json文件夹
  5. file = open('../json/' + str(pn) + '.json', 'wb')
  6. file.write(contents.content)
  7. file.close()

读取文件夹里面的所有文件:

  1. # 找出文件夹下所有xml后缀的文件
  2. def listfiles(rootdir, prefix='.xml'):
  3. file = []
  4. for parent, dirnames, filenames in os.walk(rootdir):
  5. if parent == rootdir:
  6. for filename in filenames:
  7. if filename.endswith(prefix):
  8. file.append(rootdir + '/' + filename)
  9. return file
  10. else:
  11. pass

遍历json文件夹,读取里面的东西:

  1. # 找到json文件夹下的所有文件名字
  2. files = listfiles('../json/', '.json')
  3. for filename in files:
  4. print(filename)
  5. # 读取json得到图片网址
  6. doc = open(filename, 'rb')
  7. # ('UTF-8')('unicode_escape')('gbk','ignore')
  8. doccontent = doc.read().decode('utf-8', 'ignore')
  9. product = doccontent.replace(' ', '').replace('\n', '')
  10. product = json.loads(product)

查询字典data:

  1. # 得到字典data
  2. onefile = product['data']

将字典里面的图片网址和图片名称放到数组里面:

制作一个解析头来解析图片下载:

  1. def getimg(url):
  2.  
  3. # 制作一个专家
  4. opener = urllib.request.build_opener()
  5.  
  6. # 打开专家头部
  7. opener.addheaders = [('User-Agent',
  8. 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'),
  9. ('Referer',
  10. 'http://image.baidu.com'),
  11. ('Host', 'image.baidu.com')]
  12. # 分配专家
  13. urllib.request.install_opener(opener)
  14.  
  15. # 解析img
  16. html_img = urllib.request.urlopen(url)
  17.  
  18. return html_img

最后将图片下载到本地的gif文件夹:

  1. for item in onefile:
  2. try:
  3. pic = getimg(item['thumbURL'])
  4. # 保存地址和名称
  5. filenamep = '../gif/' + validateTitle(item['fromPageTitleEnc'] + '.gif')
  6. # 保存为gif
  7. filess = open(filenamep, 'wb')
  8. filess.write(pic.read())
  9. filess.close()
  10.  
  11. # 每一次下载都暂停1-3秒
  12. loadimg = random.randint(1, 3)
  13. print('图片' + filenamep + '下载完成')
  14. print('暂停' + loadimg + '秒')
  15. time.sleep(loadimg)
  16.  
  17. except Exception as err:
  18. print(err)
  19. print('暂停' + loadimg + '秒')
  20. time.sleep(loadimg)
  21. pass

得到效果如下:

本文只是编程,处理这种网址最重要的是思想,思想我写在上一篇博文:

python3抓取异步百度瀑布流动态图片(一)查找post并伪装头方法

思想有了,程序是很简单的问题而已。

python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解的更多相关文章

  1. python3抓取异步百度瀑布流动态图片(一)查找post并伪装头方法

    打开流程: 用火狐打开百度图片-->打开firebug-->输入GIF图-->搜索-->点击网络-->全部 观察页面: 首先要观察的对象是“域”,图片的json一般是放在 ...

  2. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  3. Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms

    自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,e ...

  4. 【js】【图片瀑布流】js瀑布流显示图片20180315

    js实现把图片用瀑布流显示,只需要“jquery-1.11.2.min.js”. js: //瀑布流显示图片 var WaterfallImg = { option: { maxWidth: 850, ...

  5. 利用wget 抓取 网站网页 包括css背景图片

    利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...

  6. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  7. Python3抓取javascript生成的html网页

    用urllib等抓取网页,只能读取网页的静态源文件,而抓不到由javascript生成的内容. 究其原因,是因为urllib是瞬时抓取,它不会等javascript的加载延迟,所以页面中由javasc ...

  8. python3抓取淘宝评论内容

    好久没有写爬虫了,今天研究了下淘宝商品评论的内容. 一开始用最简单的方法,挂代理,加请求头,对网页请求,是抓不到数据的,在网上找了一些相关文章,也基本已经过时了,就是网站逻辑有改动,用旧的方法是抓不到 ...

  9. Python3 抓取豆瓣电影Top250

    利用 requests 抓取豆瓣电影 Top 250: import re import requests def main(url): global num headers = {"Use ...

随机推荐

  1. CSS样式选择器

    <!-- css样式选择器 HTML选择器 类选择器 ID选择器 关联选择器 组合选择器 伪元素选择器 selector{ /* selector是样式选择器 property:value; / ...

  2. Connection to DB

    Connect to MySQL PHP5 and later can work with a MySQL database using MySQLi extension PDO PDO will w ...

  3. IOS源码封装成.bundle和.a文件,以及加入xib的具体方法,翻遍网络,仅此一家完美翻译!! IOS7!!(3) 完美结局

    以上翻译有误解之处,现在简单做法如下: 经过深入研究,才感觉明白了内部机制,现在简单介绍于下,主要步骤:xcode5 创建库项目,删掉测试文件和默认创建的类,添加viewController类带xib ...

  4. Margaritas on the River Walk_背包

    Description One of the more popular activities in San Antonio is to enjoy margaritas in the park alo ...

  5. HDU 1811

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 中文码题 对于等号的情况,用并查集合并(因为编号不同一定可以分出先后) 然后判断能否构成拓扑排序,以及拓扑 ...

  6. HDU 1109

    http://acm.hdu.edu.cn/showproblem.php?pid=1109 一个范围内给一堆点,求到这些点的最短距离最大 模拟退火,温度是步长 #include <iostre ...

  7. Play Framework常用标签list,set,如何遍历list、map类型数据

    最近一段时间的项目都是在Play这个框架上进行开发的,挺强大的,但不足之处也挺多的.今天分享下play中强大的标签,遍历list,map类型的数据的用法. 遍历单纯的list数据,例如:List< ...

  8. ubuntu 挂载优盘

    不知道为什么重装一次ubuntu后无法自动挂载优盘,只好手动: sudo mount /dev/sdb1 /media/YCC_FD/ 注意,这里优盘是sdb 而非sda 查找自己优盘在什么地方,可以 ...

  9. poj 1990 MooFest

    题目大意: FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x.另外,每头牛还有一个自己的声调v,如果两头牛(i和j)之间想要沟通的话,它们必须用同个音调max(v[i],v[ ...

  10. sprintf 用法

    字符串格式化命令,主要功能是把格式化的数据写入某个字符串中 试试下面的代码就知道了 #include<cstdio> #include<cstdlib> using names ...