我选择的起始网址:http://www.hao123.com/auto/brand
当你随便选择一个车牌的选框( 不要 同时选择多个选框)你就会发现每个车牌对应一个网址 每个网址的区别就是数字不同
比如选中奥迪时对应的网址:https://car.58che.com/brand/1.html 也就是说按数字来就可以遍历所有的汽车了
我要爬取的是汽车网站的所有汽车的外观图片,所以下一步就是找汽车外观图片,先点击一辆汽车进入下一个页面
发现汽车外观图片在左下角的那个地方 点击进入里面的详细页面
这样汽车外观图片就找到了,下一步就是看看这些图片数据是怎么加载的,按f12查看一下本页面的一些数据信息
如果没有那个html页面再按f5刷新一下,发现这些图片都是通过js加载的,所有图片都是以json的数据格式存储在imgList这个变量中,然后图片的地址在里面的imgSrc这个属性中。
到这里基本就弄清楚了,理一下思路,人工的话就是点击一个选框选中一个牌子,再在下面的不同型号中选中一个进入下一个页面,然后再在这个页面找到外观图片的入口,最后就进入外观图片的页面了,这些外观图片都在一个滚动列表里,然后把他们一个一个下载下来,然后用代码实现这个过程。
除了下载所需要的包外,还要下载phantomjs(下载后记住下载地址,代码里要用到,我存放的地址是D:/phantomjs-2.1.1-windows/bin/phantomjs) 环境是python3 编译器pycharm
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import json
import os
import urllib.request
# 下载图片函数
def download_img(url,name1,name2):
# 获取url最后面的字符串作为图片的名称,先以/分割,再取最后一部分
splist_list = url.split('/')
filename = splist_list.pop()
# 存储图片的地址
path = 'D:/cars'+'/'+name1+'/'+name2
# 如果路径文件夹不存在就自行创建
if not os.path.exists(path):
os.makedirs(path)
# 拼接全路径
file_path = os.path.join(path, filename)
# 下载图片
urllib.request.urlretrieve(url,filename=file_path)
def parse_page(url):
# 获取这个页面的车辆品牌,并把它的品牌名字存放在name1
response = requests.get(url)
soup = BeautifulSoup(response.content,'lxml')
choose_name = soup.find('div',class_='r select_sub1 select_re p')
name = choose_name.find_all('a')[0]
name1 = name.get_text()
uls = soup.find('ul',class_='s_list clearfix')
li = uls.find_all('li')
# 遍历这个品牌下所有不同型号的车辆,并获取他们所链接的下一个网址
for x in li :
name = x.find_all('a')[1]
name2 = name.get_text()
print(name2)
a = x.find_all('a')[0]
# url2就是这个型号下链接的网址
url2 = 'https:'+a['href']
response2 = requests.get(url2)
soup2 = BeautifulSoup(response2.content,'lxml')
div = soup2.find('div',class_='smallimg')
a2 = div.find_all('a')[0]
# url3就是外观图片的网址
url3 = 'https:'+ a2['href']
response3=requests.get(url3)
soup3 =BeautifulSoup(response3.content,'lxml')
# 图片存放在js代码里的一个变量里,这里就是获得这个变量里面的值
script = soup3.find_all('script')[9]
driver = webdriver.PhantomJS(executable_path='D:/phantomjs-2.1.1-windows/bin/phantomjs')
driver.get(url3)
r = driver.execute_script("return imgList")
jd = json.loads(r)
# 获取到的值是json数据格式,解析json数据并获取图片的地址
for each in jd :
imgSrc = 'https:'+each['imgSrc']
productName = each['productName']
# 下载图片
download_img(imgSrc,name1,name2)
print('-'*100)
def main():
# 初始网址,网址规律b1,b2,b3......
url = 'https://car.58che.com/series/b1_s5.html'
parse_page(url)
if __name__ == '__main__':
main()
运行结果