上期说到,下期更新爬取煎蛋网妹纸的selenium版本,它来了!!!
本文代码依旧采用模块化程序设计思想,设计了三个模块来完成不同的功能,分别是上述三个模块,接下来,简单干脆,进入主题,一起分析完成代码操作吧!!
获取页面url信息
- 也许还是思考这个模块有什么作用呢,噢,是这样子的!本模块是将基本的页面所包含的几个页面的链接解析并保存下来。
- 下面我们就要对网页进行分析,首先打开开发者模式(快捷键为F2),对需要解析的页面进行定位,也就是点击左上角的符号,将鼠标拖拽到页码的位置,就会在页面源码中发现页面保存的位置,得到页码保存的位置,就可以将其解析出来。
- 上面我们发现了页码其实对应的是url链接,我们将其解析出来,在后面的模块中将逐一获取每一个url对应的图片的信息。我们通过观察发现所有的url都保存在div class = “cp-pagenavi” 下面的 a 标签里面。所以我们只要将 a 标签里买你的 href 属性里面的内容解析出来,就是我们需要的url 链接。
那么我们直接上代码,都已经说得很清楚了~~~~~
def get_url_list():
try:
browser = webdriver.Firefox()
browser.get('http://jandan.net/ooxx')
url = browser.find_element_by_class_name('cp-pagenavi')
href = url.find_elements_by_tag_name('a')
href_list = []
for idx,ele in enumerate(href):
url = ele.get_attribute('href')
href_list.append(url)
print(f'url_{idx}: {ele.get_attribute("href")}')
time.sleep(1 + random.random())
#print(href_list)
return href_list
except NoSuchAttributeException:
print('No Element!')
finally:
browser.close()
获取图片url信息
- 这个模块将每一个url链接中的所有图片的链接保存下来,在后面的模块中将其进行保存。那么来看 ,我们打算保存的是图片的原图,所有的图片连接都保存在文本内容是 [查看原图] 的 a 标签里面。我们只要将 a 标签的 href 属性里面的内容解析出来,就是我们需要的图片的地址链接,而且这样做的话也不需要进行异常处理,程序只是检测所有的【查看原图】,更加具有稳定性。
还是来直接看代码~~~~~~
def get_img_list(url):
try:
browser = webdriver.Firefox()
browser.get(url)
ol = browser.find_elements_by_partial_link_text('[查看原图]')
img_list = []
for idx,ele in enumerate(ol):
url = ele.get_attribute('href')
img_list.append(url)
print(f'ol_{idx}:{ele.get_attribute("href")}')
#print(img_url)
return img_list
finally:
browser.close()
永久性保存图片
- 这个模块是将保存下来的图片的链接地址进行请求,将二进制的图片进行可视化存储。我们首先通过os库在根目录下面创建一个文件夹保存所有的图片,其次将图片的链接进行请求,保存图片。
原理就是这么一个原理,直接上代码!!!
def save_img_list(message):
if not os.path.exists('./img_Libs'):
os.mkdir('./img_Libs')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
for img in message:
try:
response = requests.get(url=img, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
img_data = response.content
except TimeoutError:
print('请求超时!!!')
img_path = './img_Libs/' + img.split('/')[-1]
#print(img_path)
with open(img_path,'wb') as fp:
fp.write(img_data)
print('All pictures is successfully!!')
注释:
- 本文采用了selenium进行页面的自动化爬取,它是一个自动化测试工具。本文以Firefox进行爬取,在使用之前请确保安装好Firefox浏览器并配置好geckodriver。另外,还需要正确安装好Python的Selenium库。
- selenium的安装
最简单的方法使用pip安装:pip install selenium - GeckoDriver的安装
下载地址:https://github.com/mozilla/geckodriver/releases
下载完成之后,将geckodriver.exe文件拖拽到Python的Scripts目录下面。 - 上全部源代码。
import time
import random
import requests
import os
from selenium import webdriver
from selenium.common.exceptions import NoSuchAttributeException
def get_url_list():
try:
browser = webdriver.Firefox()
browser.get('http://jandan.net/ooxx')
url = browser.find_element_by_class_name('cp-pagenavi')
href = url.find_elements_by_tag_name('a')
href_list = []
for idx,ele in enumerate(href):
url = ele.get_attribute('href')
href_list.append(url)
print(f'url_{idx}: {ele.get_attribute("href")}')
time.sleep(1 + random.random())
#print(href_list)
return href_list
except NoSuchAttributeException:
print('No Element!')
finally:
browser.close()
def get_img_list(url):
try:
browser = webdriver.Firefox()
browser.get(url)
ol = browser.find_elements_by_partial_link_text('[查看原图]')
img_list = []
for idx,ele in enumerate(ol):
url = ele.get_attribute('href')
img_list.append(url)
print(f'ol_{idx}:{ele.get_attribute("href")}')
#print(img_url)
return img_list
finally:
browser.close()
def save_img_list(message):
if not os.path.exists('./img_Libs'):
os.mkdir('./img_Libs')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
for img in message:
try:
response = requests.get(url=img, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
img_data = response.content
except TimeoutError:
print('请求超时!!!')
img_path = './img_Libs/' + img.split('/')[-1]
#print(img_path)
with open(img_path,'wb') as fp:
fp.write(img_data)
print('All pictures is successfully!!')
def main():
href_list = get_url_list()
for url in href_list:
img_list = get_img_list(url)
save_img_list(img_list)
print('Everything is done!!!')
if __name__ == '__main__':
main()