Python3爬虫--阶段性成果

来源:互联网 发布:php简易商城源码 编辑:程序博客网 时间:2024/05/16 13:47

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

工具:Anaconda3

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

相关网页源代码:

这里写图片描述

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

from bs4 import BeautifulSoupimport requestsurlpage = "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_2Out[9]: 'http://mm.howkuai.com/wp-content/uploads/2017a/04/18/02.jpg'In [10]: img_name_2Out[10]: '你觉得哪个妹纸最打动你的心,第2张'

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

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

In [12]: from urllib.request import urlretrieveIn [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 BeautifulSoupimport requestsfrom urllib.request import urlretrieveimport urllib.requestopener=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库中的高级用法,没有封装代码。

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

原创粉丝点击