Python 爬取蜂鸟网的照片

初衷

上次兔子君问 如何下载 蜂鸟网 上图集的一张照片。打开之后,确实无法右键另存为。不应该啊,web上面还没有这么强的技术保护发布的图片。firebug查看,图片的搜索总是指向一个 a标签。这个 a 标签有一个 height:100%。应该是一个遮罩,用来给幻灯片浏览导航使用的。无意中也进行了简单的 盗图保护。

下载很简单,不过兔子先生的需求有变,需要下载一个图集,这样右键的行为,显然比较累。唔,想要下载一个图集,写脚本 爬虫了。爬一个图集下来,python这方面是好手。               

分析

分析页面,每一个图集并不是 ajax 取照片,而是每一张照片一个页面。并且页面的URL地址很规律,某个值依次加一。例如        这个图集的所有照片:

http://travel.fengniao.com/slide/334/3344576_1.html#show 

http://travel.fengniao.com/slide/334/3344576_2.html#show 

都是 3344576_1, 3344576_2有变动,每一图都在一个特有的 img标签里。如下图:

问题的解决思路有了,用 python的 urllib2模块打开 url,这些 url 依次递增1,用 list 解析给 urllib2模块。当得到 web的html之后,再用 BeautifulSoup 解析文档,提取 img 的 url。

主要用到了 urllib2 的urlopen方法,和  BeautifulSoup 的findAll方法和 tag对象获取属性的方法。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# target url
# http://travel.fengniao.com/slide/334/3344576_%d.html
# target picture
# <img src="http://img2.zol.com.cn/product/101/538/ceDuLihKRGmck.png" name="img_share" id="mainPic" width="449" height="636" alt="">
                                          
import urllib2
from BeautifulSoup import BeautifulSoup
      
urlList = 'http://travel.fengniao.com/slide/334/3344576_1.html'
html = urllib2.urlopen(urlList)
soup = BeautifulSoup(html)
imgsResult = soup.findAll('img',id="mainPic")
print imgsResult[0]['src']


"""
# time python image.py 
http://img2.zol.com.cn/product/101/538/ceDuLihKRGmck.png


real    0m15.562s
user    0m0.103s
sys     0m0.104s
"""


# get the url of web which has the picture =>url results
urlList = ['http://travel.fengniao.com/slide/334/3344576_%d.html' % i for i in range(1,40)]
imgurl = []
# open every url via urllib2,get the img tag via BeautifulSoup
for i in urlList:
	#print i
    html = urllib2.urlopen(i)
    soup = BeautifulSoup(html)
    imgsResult = soup.findAll('img',id="mainPic")
    imgurl.append(imgsResult[0]['src'])
                                           
# the result
print imgurl


基于Python Scrapy实现的蜂鸟数据采集爬虫系统 含代理、日志处理和全部源代码等 import scrapy from fengniao.items import FengniaoItem from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import TimeoutError, TCPTimedOutError, DNSLookupError, ConnectionRefusedError class FengniaoclawerSpider(scrapy.Spider): name = 'fengniaoClawer' allowed_domains = ['fengniao.com'] # 爬虫自定义设置,会覆盖 settings.py 文件中的设置 custom_settings = { 'LOG_LEVEL': 'DEBUG', # 定义log等级 'DOWNLOAD_DELAY': 0, # 下载延时 'COOKIES_ENABLED': False, # enabled by default 'DEFAULT_REQUEST_HEADERS': { # 'Host': 'www.fengniao.com', 'Referer': 'https://www.fengniao.com', }, # 管道文件,优先级按照由小到大依次进入 'ITEM_PIPELINES': { 'fengniao.pipelines.ImagePipeline': 100, 'fengniao.pipelines.FengniaoPipeline': 300, }, # 关于下载图片部分 'IMAGES_STORE': 'fengniaoPhoto', # 没有则新建 'IMAGES_EXPIRES': 90, # 图片有效期,已经存在的图片在这个时间段内不会再下载 'IMAGES_MIN_HEIGHT': 100, # 图片最小尺寸(高度),低于这个高度的图片不会下载 'IMAGES_MIN_WIDTH': 100, # 图片最小尺寸(宽度),低于这个宽度的图片不会下载 # 下载中间件,优先级按照由小到大依次进入 'DOWNLOADER_MIDDLEWARES': { 'fengniao.middlewares.ProxiesMiddleware': 400, 'fengniao.middlewares.HeadersMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }, 'DEPTH_PRIORITY': 1, # BFS,是以starts_url为准,局部BFS,受CONCURRENT_REQUESTS影响 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'REDIRECT_PRIORITY_ADJUST': 2, # Default: +2 'RETRY_PRIORITY_ADJUST': -1, # Default: -1 'RETRY_TIMES': 8, # 重试次数 # Default: 2, can also be specified per-request using max_retry_times attribute of Request.meta 'DOWNLOAD_TIMEOUT': 30, # This timeout can be set per spider using download_timeout spider attribute and per-request using download_timeout Request.meta key # 'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter", # 'SCHEDULER': "scrapy_redis.scheduler.Scheduler", # 'SCHEDULER_PERSIST': False, # Don't cleanup red
### 回答1: 以下是一个简单的 Python 爬取照片的代码: ```python import requests from bs4 import BeautifulSoup url = 'https://www.example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') img_tags = soup.find_all('img') urls = [img['src'] for img in img_tags] for url in urls: img_data = requests.get(url).content with open('image_name.jpg', 'wb') as handler: handler.write(img_data) ``` 这个代码可以爬取网页中的所有图片,并将其保存到本地。 ### 回答2: 使用Python爬取照片的代码可以分为以下几个步骤: 1. 导入需要的库:首先要导入`requests`库,用于发送HTTP请求,获取网页内容;然后导入`BeautifulSoup`库,用于解析网页内容。 2. 发送HTTP请求获取网页内容:使用`requests`库发送GET请求,获取目标网页的源代码。可以使用以下代码将网页内容保存到一个变量`html`中: ```python import requests url = "目标网页的URL" response = requests.get(url) html = response.text ``` 3. 解析网页内容:使用`BeautifulSoup`库对网页内容进行解析。可以使用以下代码将`html`变量的内容解析成`BeautifulSoup`对象: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser') ``` 4. 定位照片链接:通过查看目标网页的源代码,找到照片所在的HTML元素的标签和属性,使用`BeautifulSoup`库提供的方法定位到这些元素。例如,如果照片是在`<img>`标签中的`src`属性中,则可以使用以下代码定位到所有的照片链接: ```python photo_links = [] img_tags = soup.find_all('img') for img_tag in img_tags: photo_link = img_tag['src'] photo_links.append(photo_link) ``` 5. 下载照片:使用`requests`库向获取到的照片链接发送GET请求,将照片保存到本地。可以使用以下代码下载照片: ```python for photo_link in photo_links: photo_resp = requests.get(photo_link) with open('保存路径', 'wb') as f: f.write(photo_resp.content) ``` 以上就是使用Python爬取照片的代码概述,具体的实现方法还要根据目标网页的结构和照片的位置来进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向良玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值