一个爬取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保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...
随机推荐
- ios移动端原生滚动条滚动不灵敏问题
最近开发微信页面的时候遇到了这个问题, 因为移动端浏览器的原生滚动条样式很好,不像pc端那么难看,所以在页面需要滚动的地方用了原生的滚动条,这种滚动条在安卓浏览器中没有任何问题,但是在ios微信浏览器 ...
- 提高java编程质量 - (三)三目运算符的两个操作数类型尽量一致
先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...
- python 标准库 -- pickle & cPickle
pickle & cPickle pickle 和 cPickle 除了导入名称不一样之外, 使用方法, 均一样. pickle 导入 import pickle cPickle 导入 imp ...
- 一步一步教你将开源项目上传到jcenter
最近闲着看了一下jcenter的使用,也想将自己使用频率比较高的东西抽成类库,然后通过compile来使用,提高开发效率,本来以为挺简单的,但是网上介绍的比较模糊,很多博客也比较老了,不适用,花了我一 ...
- Easyui设置动态表格,动态导出数据实例,附Dome
最近碰到一个需求,需要提供一个弹出页面选择列表页面需要显示的列,页面确认之后需要修改列表页面显示的表格,导出的数据也需要同步变化. 下面直接上代码 1.设置需要显示的列columus为全局对象,用于子 ...
- v9 频道页如果有下级栏目跳转到第一个栏目链接
{if $CATEGORYS[$catid]['child']==1} {php $firstarr = explode(',',$CATEGORYS[$catid]['arrchildid']);} ...
- Centos6.5 源码编译安装 Mysql5.7.11及配置
安装环境 Linux(CentOS6.5 版).boost_1_59_0.tar.gz.mysql-5.7.11.tar.gzMySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘. ...
- Java基础(7)-异常处理
异常处理 异常继承层次 Throwable |-Error 致命的错误无法处理 |-Exception |-IOException 系统资源读取失败等错误 |-RuntimeException(未检异 ...
- P2727 Stringsobits
01串 Stringsobits 题目背景 考虑排好序的N(N<=31)位二进制数. 题目描述 他们是排列好的,而且包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L<=N)的数 ...
- ps命令学习笔记
最近在看linux优化大师这本书,第2章祥细讲解了分析系统用的工具,这里把一些内容整理出来,以便加深印像. 当进行系统分析时,ps命令显示有关选择的活跃进程的信息.ps命令提供当前已存在的进程列表,和 ...