一个爬取Bing每日壁纸的python脚本
1. 背景
- Bing搜索每天的背景图片有些比较适合做桌面,但是有的提供下载有的不提供下载。每天去点击下载又不太方便,所以第一次学习了一下python爬虫怎么写,写的很简单。
2. 相关技术
2.1 Python爬虫参考
2.2 Python正则表达式
2.3 解决登录问题
- 一些网站需要登录操作,应该是大部分网站都是登录操作的。
- 登录方案参考:模拟登录一些知名的网站
2.4 logging:内置日志库
3. 爬虫实现
- 爬虫分三个部分:请求,解析,保存。
- 下面只展示主要逻辑代码。完整代码参考Github。
3.1 请求脚本
import urllib.request
import re
import logging
def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
if html:
logging.debug("Get Response:"+str(len(html)))
else:
logging.warning("Request failed!")
return html.decode('utf-8')
3.2 解析脚本
- 重点是解析脚本,这里定义了两种方法:一种通过正则表达式匹配,另一种使用BeautifulSoup解析文档树。通过文档书解析是原来通过下载页面来解析的,但是发现下载的页面与直接请求http://cn.bing.com/获得的响应是不同的,因为有js脚本做了后续处理。所以无法做爬虫解析。只能使用了正则表达式匹配,效果还好。
from bs4 import BeautifulSoup
import json
import re
import logging
def getJpg(html):
reg = r'(url:.{10,90}jpg)' //这里匹配包含"url:**jpg"的字符串,没写出更精确的正则表达式,只能写匹配10到90个字符了
logging.debug("Using re "+reg+" to get Jpg")
jpgre= re.compile(reg)
jpglist=re.findall(jpgre,html)
if jpglist:
logging.debug("Get jpg list("+str(len(jpglist))+"):"+str(jpglist))
jpgUrl = jpglist[0].split('"')[1]
imageUrl = host+jpgUrl
logging.info("Get jpg url:"+imageUrl)
return imageUrl
def bingParser(html):
#soup=BeautifulSoup(html,"html.parser")//直接解析响应就会有问题获取不到
soup=BeautifulSoup(open('Bing.html'),"html.parser") //最初通过下载的页面解析成功
print(soup.title)
print(type(soup.a))
print(soup.select('#bgDiv'))
style = (soup.select('#bgDiv')[0].attrs['style']).strip()
print(style)
json_style=json.dumps(style)
print(json_style)
imageurl=style.strip().split(';')[-3:-2]
#print(imageurl[0].split('"')[1])
imageUrl = (imageurl[0].split('"')[1])
#imageUrl = (imageurl[0].split(':')[1].strip().split('"')[1])
print(imageUrl)
return imageUrl
3.3 保存脚本
- 保存脚本是需要运行的脚本,所以其他脚本都在这里调用了。
import urllib.request
import urllib.parse
import parseHtml
import request
import logging
import sys
//定义日志
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='bingcn.log',
filemode='a'
)
host="http://cn.bing.com"
logging.info("From:"+host)
html = request.getHtml(host)
imageurl = parseHtml.getJpg(html)
logging.info("Image url:"+imageurl)
fileName = imageurl.split('/')[-1:][0]
logging.info("Image file name:"+fileName)
def saveImg(imageURL,fileName):
url = (imageURL)
logging.info('Image file url:'+url)
#url=urllib.parse.urlencode(url)
u = urllib.request.urlopen(url)
data = u.read()
f = open(fileName, 'wb')
f.write(data)
logging.info("Save file :"+imageURL)
f.close()
saveImg(imageurl,fileName)
4. 运行
- 脚本针对python3环境写的,直接运行saveImage.py即可。
- 如果使用日志文件的方式,可以在当前目录下看到日志文件bingcn.log,保存的图片也在当前目录下。
james@james:~/code/hello-world/code/python/networkong/pycrowler/crowler_bingcn > python3 saveImage.py
2017-06-26 14:36:05 saveImage.py[line:19] INFO From:http://cn.bing.com
2017-06-26 14:36:06 request.py[line:12] DEBUG Get Response:126510
2017-06-26 14:36:06 parseHtml.py[line:91] DEBUG Using re (url:.{10,90}jpg) to get Jpg
2017-06-26 14:36:06 parseHtml.py[line:95] DEBUG Get jpg list(2):['url: "/az/hprichbg/rb/MadagascarLemurs_ZH-CN7754035615_1920x1080.jpg', "url:'\\/az\\/hprichbg\\/rb\\/CallanishSS_ZH-CN12559903397_1920x1080.jpg"]
2017-06-26 14:36:06 parseHtml.py[line:98] INFO Get jpg url:http://cn.bing.com/az/hprichbg/rb/MadagascarLemurs_ZH-CN7754035615_1920x1080.jpg
2017-06-26 14:36:06 saveImage.py[line:24] INFO Image url:http://cn.bing.com/az/hprichbg/rb/MadagascarLemurs_ZH-CN7754035615_1920x1080.jpg
2017-06-26 14:36:06 saveImage.py[line:26] INFO Image file name:MadagascarLemurs_ZH-CN7754035615_1920x1080.jpg
2017-06-26 14:36:06 saveImage.py[line:30] INFO Image file url:http://cn.bing.com/az/hprichbg/rb/MadagascarLemurs_ZH-CN7754035615_1920x1080.jpg
2017-06-26 14:36:06 saveImage.py[line:36] INFO Save file :http://cn.bing.com/az/hprichbg/rb/MadagascarLemurs_ZH-CN7754035615_1920x1080.jpg
一个爬取Bing每日壁纸的python脚本的更多相关文章
- Python爬取金山词霸每日一句,存储到MySQL中
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/3 20:25 # @Author : baoshan # @Site : ...
- 【开源小软件 】Bing每日壁纸 让桌面壁纸保持更新
发布一个开源小软件,Bing每日壁纸. 该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 欢迎大家下载使用,点star!有问题请留言或者提issue. 开源地 ...
- 上班从换一张桌面壁纸开始——开源小工具Bing每日壁纸
发布一个自用的开源小软件,Bing每日壁纸,使用c# winform开发.该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 功能特性 自动获取Bing最新图片 ...
- 【PHP】使用PHP抓取Bing每日图像并为己所用
Bing搜索的首页每天都会推送一张很漂亮的图片,把它保存下来,当做电脑桌面或是自己的网站背景图还不是美滋滋…… 今天的bing图片是这样的 既然要抓取这张图片,首先就得弄清这张图是从何而来的.经过对必 ...
- 【开源小软件 】Bing每日壁纸 V1.2.1
Bing每日壁纸发布V1.2版本,下载地址Release V1.2.1 该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 本次新增国际化支持,以及桌面widg ...
- DzzOffice添加动态壁纸例子-Bing每日壁纸
Bing每日壁纸介绍:bing网站每天会更新一张不同的精选图片. 此压缩包内的程序,可以自动同步更新cn.bing.com网站每天更新的图片,作为dzzoffice的壁纸使用.实现自动每天更换不同的云 ...
- 获取Bing每日壁纸用作首屏大图
获取Bing每日壁纸用作首屏大图 Bing 搜索每天都会更换一张精美的图片作为壁纸,除了特殊时候不太好看外(比如春节那几天),没多大问题.移动端还有上每日故事,与图片现配.现在我的博客首屏图片就是Bi ...
- Python学习 —— 爬虫入门 - 爬取Pixiv每日排行中的图片
更新于 2019-01-30 16:30:55 我另外写了一个面向 pixiv 的库:pixiver 支持通过作品 ID 获取相关信息.下载等,支持通过日期浏览各种排行榜(包括R-18),支持通过 p ...
- 用Python实现一个爬取XX大学电费通知的小脚本
内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...
随机推荐
- oracle日期时间函数 总结
表中存在伪列:sysdate,systimestamp 伪列存在但是不显示 select sysdate from dual; select systimestamp from dual; 日期计算公 ...
- APUE-文件和目录(七)符号链接
符号链接 符号链接的用途 符号链接是对一个文件的间接指针,它与前面介绍的硬连接不同,硬连接指向文件的i节点.引入符号链接是为了避开硬连接的一些限制: 硬链接通常要求链接和文件位于同一文件系统中. 只有 ...
- 每天一个JS 小demo之商品筛选。主要知识点:DOM方法综合运用
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
- thinkphp5.0学习笔记(二)
本文为公司制作API接口后台的小结! 1.命名注意事项: 不要使用易混淆的名字,如index,index01... 我喜欢用拼音... 比如: public function zhuce(Reques ...
- C++将一个数组内容赋给另一个数组
有两种方式: 一.进行数组遍历,依次赋值 ] = { , , , , }; ] ={ }; ;i<sizeof(arr1)/sizeof(int);i++) arr2[i] = arr1[i] ...
- 为什么使用bootstrap在一个页面同时做两个轮播效果时,只有第一个有效??
我们都知道使用bootstrap做轮播效果非常快,但是有时候一个页面会需要两个轮播:但这个时候再次使用bootstrap做轮播效果时就会失效:原因在于bootstrap的Carousel问题,只要修改 ...
- 360安全检测出的WordPress漏洞的修复方法
1.跨站脚本攻击(XSS) 这个漏洞注意是因为用户评论可以提交代码,有安全风险.虽然你的WordPress以及是最新版,但是你的WordPress主题却不一定跟着更新!因此,需要稍微修改一下评论相关的 ...
- 检查服务器是否开启GD库
1.把以下代码复制到记事本中并保存成A.php<?phpOb_end_flush();header ("Content-type: image/png");$im = @im ...
- [USACO08JAN]手机网络Cell Phone Network
[USACO08JAN]手机网络Cell Phone Network 题目描述 Farmer John has decided to give each of his cows a cell phon ...
- 【RAC】RAC相关基础知识
[RAC]RAC相关基础知识 1.CRS简介 从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...