python学习(二)---爬取网页图片

爬取图片的基本思路

1.分析图片地址流程

Created with Raphaël 2.1.0 Start 输入搜索关键词 点击【F12】进入开发者界面 选择【Network】,选择【All】,点击【Name】列表中的第一个“sad?page=1” 如图1 不断【F5】刷新,查看【Name】列表变化,找到【header】中Request URL 点击【下一页】查看URL变化,同时结合query parameter(有时候请求参数会以Json格式传输,如baidu) End

图1:
这里写图片描述

2.下载图片流程

Created with Raphaël 2.1.0 Start 获取总页码:右击页码选择框,点击【检查】,在此附近搜索总页码。如总共6页。可以搜索“6”、“by 6” 获取当前页所有图片地址,两种方法:(1)进入每张图片的页面,获取地址,再下载; (2)直接用获取所有图片地址:http://***.jpg,可以用正则表达式findall获取。 下载每张图片 End

3. 需要准备的包

frome bs4 import BeautifulSoup #用于解析HTML标签的包,注意3.6版本的python要安装4.4以上的版本
import Request    #用于url请求获取html回应包
import html5lib   #
import urllib3    #

有了上述的分析,我们举3个例子,难度由易到难,进行演示.

实战(一)-简单的图片爬取

1. 得到带keyword的URL

举例: 网站1
假设输入搜索关键词”sad”,经过分析得到:主地址+keyword,【http://www.fotocommunity.com/photos/sad?】

2. 获取图片总页码

url = 'http://www.fotocommunity.com/photos/sad?'
res = request.get(url)
#html format
soup = BeautifulSoup(res.content, 'html5lib')
#find total pages num
filter = 'div.fcx-photos-container > div.container > div.row > div.col-xs-12.col-lg-4 > div > h1'
total_pages_num = soup.select(filter)[0].string.split('by')[1]

2. 获取每个page的URL

url = base_url + 'page=' + str(page+1)
res = requests.get(url)
img_url_list = re.findall('data-src="(.*?)"', res.text, re.S)

3. 获取每张图片的URL,下载图片

for img_url in img_url_list:
    img_data = requests.get(img_url)
    img_count += 1
    file_name = 'pic\\' + keyword + '\\' +cur_time +'_%d'%img_count
    if not os.path.exists('pic\\' + keyword):
        os.mkdir('pic\\' + keyword)
    open('%s.jpg'%file_name,'wb').write(img_data.content)
    print('已下载第 %d 张 图片...'%img_count)

实战(二)-构造json请求包的图片爬取

1. 得到带keyword的URL

举例: 网站2
【分析(瀑布流)】
在如下页面下,向下滑动鼠标,【Name】有新加入list的地址,点击一个查看【XHR】发现了主地址+一串字符
这里写图片描述

得到:主地址【https://image.baidu.com/search/acjson?】

2. 构造Json字符串,下载图片

 pn = currentpage * step
        params = {
                    'tn': 'resultjson_com',
                    'ipn': 'rj',
                    'ct': 201326592,
                    'is': '',
                    'fp': 'result',
                    'queryWord': keyword,#搜索关键词
                    'cl': 2,
                    'lm': '',
                    'ie': 'utf-8',
                    'oe': 'utf-8',
                    'adpicid': '',
                    'st': -1,
                    'z': '',
                    'ic': 0,
                    'word': keyword,    #搜索关键词
                    's': '',
                    'se': '',
                    'tab': '',
                    'width': '',
                    'height': '',
                    'face': 1,
                    'istype': 2,
                    'qc': '',
                    'nc': 1,
                    'fr': '',
                    'pn': pn,          #当前滑动到的位置
                    'rn': step,        #每次显示30附图
                    'gsm': str(hex(pn))[2: ].upper(),
                    '1504664546883': ''
        }
# http 池管理
http = urllib3.PoolManager()
# 模拟浏览器
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
}
resp = http.request(method='GET', url=weburl, fields=params, headers=headers)
# 格式化一下json串,减少解析失败次数
respdata = invalid_escape.sub('', resp.data.decode('utf-8')).replace('\\','')
jsondata = json.loads(respdata)
datalist = jsondata.get('data')
for data in datalist:
    url = data.get('thumbURL')
    downloadList.append(url)

实战(三)-模拟浏览器的图片爬取

总结

参考文章及格式化工具

1.【图文详解】python爬虫实战——5分钟做个图片自动下载器
2.JS/HTML格式化
3.Python 正则re模块之compile()和findall()详解
4.python中的try/except/else/finally语句
5.URL中“#” “?” &“”号的作用
6.Python爬虫利器二之Beautiful Soup的用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值