Python3爬虫--阶段性成果

124 篇文章 0 订阅

抓取妹子图网站某一个页面的专题图片。

工具:Anaconda3

详细记录从无到有的过程:

相关网页源代码:

这里写图片描述

1 requests + BeautifulSoup获取图片名和图片链接

from bs4 import BeautifulSoup
import requests

urlpage = "http://www.meizitu.com/a/5530.html"
html = requests.get(urlpage)
soup = BeautifulSoup(html.content,"lxml")
img_tag = soup.find('div',id="picture").find_all("img")
print(img_tag)

运行结果,得到了所有专题图片的标签(一个列表)。

In [1]: runfile('C:/Users/Administrator/Desktop/scrapy/meizitu1.py', wdir='C:/Users/Administrator/Desktop/scrapy')
[<img alt="你觉得哪个妹纸最打动你的心,第1张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/01.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第2张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/02.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第3张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/03.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第4张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/04.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第5张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/05.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第6张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/06.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第7张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/07.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第8张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/08.jpg"/>, <img alt="你觉得哪个妹纸最打动你的心,第9张" src="http://mm.howkuai.com/wp-content/uploads/2017a/04/18/09.jpg"/>]

可以发现,图片名字对应着 img 标签的 alt 属性,图片链接对应着 img 标签的 src 属性。

还有,每个 img 标签都是 img_tag 列表中的一个元素,例如查看列表中第二个元素的图片名和图片链接:

In [7]: img_url_2 = img_tag[1]['src']

In [8]: img_name_2 = img_tag[1]['alt']

In [9]: img_url_2
Out[9]: 'http://mm.howkuai.com/wp-content/uploads/2017a/04/18/02.jpg'

In [10]: img_name_2
Out[10]: '你觉得哪个妹纸最打动你的心,第2张'

2 根据图片链接和图片名下载图片

urllib.request库中的urlretrieve()方法可以用来下载图片:

In [12]: from urllib.request import urlretrieve

In [13]: help(urlretrieve)
Help on function urlretrieve in module urllib.request:

urlretrieve(url, filename=None, reporthook=None, data=None)
    Retrieve a URL into a temporary location on disk.

    Requires a URL argument. If a filename is passed, it is used as
    the temporary file location. The reporthook argument should be
    a callable that accepts a block number, a read size, and the
    total file size of the URL target. The data argument should be
    valid URL encoded data.

    If a filename is passed and the URL points to a local resource,
    the result is a copy from local file to new file.

    Returns a tuple containing the path to the newly created
    data file as well as the resulting HTTPMessage object.

然后想到把urlretrieve()方法加到循环体内:

for i in range(len(img_tag)):
    img_url = img_tag[i]['src']
    img_name = img_tag[i]['alt']

    path = 'F:\\meizitu\\'+img_name+'.jpg'

    urlretrieve(img_url,path)
    print("正在下载第"+str(i+1)+"张图片")

上篇文章提到过了,这时候出现了 HTTPError: Forbidden 的报错。

3 解决问题

解决方法是为请求加上HTTP头部信息,伪装成浏览器访问网页来下载图片:
打开浏览器,单击鼠标右键—检查—Network—F5刷新—单击任意Name元素—Headers—Requests Headers中的User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

这里写图片描述

修改后的代码:

from bs4 import BeautifulSoup
import requests
from urllib.request import urlretrieve
import urllib.request

opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
urllib.request.install_opener(opener)

urlpage = "http://www.meizitu.com/a/5530.html"
html = requests.get(urlpage)
soup = BeautifulSoup(html.content,"lxml")
img_tag = soup.find('div',id="picture").find_all("img")
#print(img_tag)

for i in range(len(img_tag)):
    img_url = img_tag[i]['src']
    img_name = img_tag[i]['alt']

    path = 'F:\\pic_test\\'+img_name+'.jpg'
    urlretrieve(img_url,path)
    print("正在下载第"+str(i+1)+"张图片")

运行结果:

runfile('C:/Users/Administrator/Desktop/scrapy/meizitu1.py', wdir='C:/Users/Administrator/Desktop/scrapy')
正在下载第1张图片
正在下载第2张图片
正在下载第3张图片
正在下载第4张图片
正在下载第5张图片
正在下载第6张图片
正在下载第7张图片
正在下载第8张图片
正在下载第9张图片

F盘的pic_test文件夹中出现了下载好的9张图片:

这里写图片描述

只是抓取了某个页面的图片,没有异常处理,没有使用requests库中的高级用法,没有封装代码。

但是,已经很不错了啊,哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值