python——Requests
一、写在前面
本文所需要的python库有:requests、pyquery、os、time。为保证代码的运行请先安装好对应的python库。详细安装说明:
使用pip 安装 requests使用pycharm安装 requestspyquery 安装
二、项目讲解
本次我们需要使用到的网站为:/彼岸图网
效果展示
在这里我们爬取的内容有:图片的名字(保存图片的文件名),图片内容,并将他保存下来。
三、代码详解
import requestsfrom pyquery import PyQuery as pqimport osimport timefilename = "./data" #定义图片保存的位置base_url = '/' # 基础urlheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36','referer': '/'} # 添加headers,防止网页反爬取def get_page(page):url = base_url + 'index_' + str(page) + '.html'response = requests.get(url, headers=headers)response.encoding = 'gbk'doc = pq(response.text)imgs = doc('.clearfix li a img')for img in imgs.items():yield {'url': img.attr('src'),"name": img.attr('alt')}def save_img(img):url = base_url + img['url']response = requests.get(url, headers=headers)path = filename + "/" + img['name'] + '.jpg'with open(path, 'wb') as f:f.write(response.content)f.close()if __name__ == "__main__":if not os.path.exists(filename):os.mkdir(filename)for page in range(1, 20):imgs = get_page(page)for img in imgs:save_img(img)time.sleep(1)print(page, 'has download!')
1、网页分析
首先,我们打开F12开发者模式(或者右键–>检查元素)
为了获得图片的详细信息,我们选中任意一张图片,获得其html网页代码。
从中我们可看见每一张图片的具体url都在<img>的src里面,因此我们只需要获得每个img,通过获取他的url便可以进行下载图片
为了获得更多的图片,我们再观察下一页的url。
可以发现,每个页面的url就是简单的:/+index_(page数).html。
所以有如下代码,我们将它封装在一个get_page()的函数中:
def get_page(page):url = base_url + 'index_' + str(page) + '.html'response = requests.get(url, headers=headers)response.encoding = 'gbk'doc = pq(response.text)imgs = doc('.clearfix li a img')for img in imgs.items():yield {'url': img.attr('src'),"name": img.attr('alt')}
这里,我们使用了pyquery来获得img元素,然后通过attr获得其属性值(名字,url地址)。
保存图片
def save_img(img):url = base_url + img['url']response = requests.get(url, headers=headers)path = filename + "/" + img['name'] + '.jpg'with open(path, 'wb') as f:f.write(response.content)f.close()
我们通过先前获得的名字来命名图片文件的名字,最后将它统一保存在./data文件夹中。
最后
if __name__ == "__main__":if not os.path.exists(filename):os.mkdir(filename)for page in range(1, 20):imgs = get_page(page)for img in imgs:save_img(img)time.sleep(1)print(page, 'has download!')
我们通过访问前20页的图片,将page用for循环遍历,最后通过调用之前的get_page()、save_page()函数,实现我们的彼岸图网的爬取。