在知乎上看到别人写的python爬虫,链接:同时用R语言和Python爬取知乎美图,学习一下,源代码执行不成功,稍微修改了一下,很简单,代码如下:
import requests
from bs4 import BeautifulSoup
import os
import re
import urllib
url="https://www.zhihu.com/question/35931586/answer/206258333"
header={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'}
page=requests.get(url,headers=header)
soup=BeautifulSoup(page.text,'lxml')
link_list=soup.find_all("img",class_="origin_image zh-lightbox-thumb lazy")
os.makedirs("./Image/zhihu/")
os.chdir('./Image/zhihu/')
for link in link_list:
mylink=link.get('data-original')
name=re.findall(r"v2-.*?\.jpg",mylink)[0]
urllib.request.urlretrieve(mylink,name)
学习笔记:urlretrieve(url,filename=null,reportbook=null,data=null)方法,将远程数据下载到本地,参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。
改成如下代码能看到每张图片的存储进度:
import requests
from bs4 import BeautifulSoup
import os
import re
import urllib
def callbackfunc(blocknum,blocksize,totalsize):
'''
@blocknum: 已经下载的数据块
@blocksize: 数据块的大小
@totalsize: 远程文件的数据块
'''
percent=100.0*blocknum*blocksize/totalsize
if percent>100:
percent=100
print("%.2f%%" %percent)
url="https://www.zhihu.com/question/35931586/answer/206258333"
header={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'}
page=requests.get(url,headers=header)
soup=BeautifulSoup(page.text,'lxml')
link_list=soup.find_all("img",class_="origin_image zh-lightbox-thumb lazy")
os.makedirs("./Image/zhihu/")
os.chdir('./Image/zhihu/')
for link in link_list:
mylink=link.get('data-original')
name=re.findall(r"v2-.*?\.jpg",mylink)[0]
urllib.request.urlretrieve(mylink,name,callbackfunc)
另外推荐学习资料:
Beautiful Soup 4.2.0 文档
用Python3开发爬虫