瓜子网动态爬取详情页
案例爬取的是瓜子网中热门的奥迪汽车
# 导包
import os
from openpyxl import Workbook
import csv
# 自定义保存得类
class Saving(object):
def savetoCsv(self,datalist):
with open('豆瓣top250.csv','a',encoding='utf-8',newline='')as csvfile:
write = csv.writer(csvfile)
for each in datalist:
write.writerow(each)
# print('储存完成')
# 导包
from selenium import webdriver
import time
from saving import Saving
browser=webdriver.Chrome()
# url='https://www.guazi.com/www/audi/o1/'
def gethref(url):
# 打开网页
browser.get(url)
# 每次打开主网页休眠两秒
time.sleep(2)
# 最大化我们的界面
# browser.maximize_window()
#下拉界面,for几次就是几次
for i in range(1):
time.sleep(2)
# 每次下拉的界面最好是跟自己的电脑屏幕匹配
# 查看方式是截图,看自己电脑的盖度
browser.execute_script('window.scrollBy(0,600)', '')
hreflist=[]
# 查找父元素
parent=browser.find_element_by_class_name("carlist")
# 寻找每一个li 容器
lis=parent.find_elements_by_tag_name('li')
for each in lis:
# 查找每一本详情页面的超链接
href=each.find_element_by_tag_name('a').get_attribute('href')
hreflist.append(href)
return hreflist
def getdata(hreflist):
# 重新一次打开详情页的网页
for i,each in enumerate(hreflist):
datalist = []
# 记得休眠
time.sleep(2)
# 打开网页
browser.get(each)
# 输出地市一下当前为详情页的第几页
print('爬取详情页的第',(i+1),'页')
time.sleep(2)
money=browser.find_element_by_class_name("pricestype").text # 车的价格
monet_newcar=browser.find_element_by_class_name("newcarprice").text# 原价
year=browser.find_elements_by_class_name("one")[1].find_element_by_tag_name('div').text #上牌时间
mileage = browser.find_elements_by_class_name("two")[1].find_element_by_tag_name('div').text #车表里程
address = browser.find_elements_by_class_name("three")[2].find_element_by_tag_name('div').text #上牌地
country_emissions = browser.find_element_by_class_name("four").find_element_by_tag_name('div').text #按照国家排放量标准划分
bianxiang = browser.find_element_by_class_name("five").find_element_by_tag_name('div').text # 变箱型号
emissions = browser.find_element_by_class_name("six").find_element_by_tag_name('div').text #排放量
guohu_num = browser.find_element_by_class_name("seven").find_element_by_tag_name('div').text #过户数
look_address = browser.find_element_by_class_name("eight").find_element_by_tag_name('div').text # 看车地点
nianjian_year = browser.find_element_by_class_name("nine").find_element_by_tag_name('div').text # 年检到期
qiangxian_year = browser.find_element_by_class_name("ten").find_element_by_tag_name('div').text # 强险
shangye_year = browser.find_elements_by_class_name("last")[1].find_element_by_tag_name('div').text # 商业险
parent1=browser.find_element_by_class_name("detailcontent")
parent2=parent1.find_elements_by_tag_name('table')[0]
model=parent2.find_elements_by_tag_name('tr')[1].find_elements_by_tag_name('td')[1].text# 车型号
vendor = parent2.find_elements_by_tag_name('tr')[2].find_elements_by_tag_name('td')[1].text# 厂商
level=parent2.find_elements_by_tag_name('tr')[3].find_elements_by_tag_name('td')[1].text# 级别
engine=parent2.find_elements_by_tag_name('tr')[4].find_elements_by_tag_name('td')[1].text# 发动机
datalist.append([money,monet_newcar,year,mileage,address,country_emissions,bianxiang,emissions,guohu_num,look_address,
nianjian_year,qiangxian_year,shangye_year,model,vendor,level,engine])
# 没提取一整条信息,就保存一次,防止被反扒之后以前的信息没有的,不做无用功
save(datalist)
print('保存详情页的第', (i + 1), '页的数据成功')
# 自定义 保存对象
def save(datalist):
# 对象实例化
mysave=Saving()
mysave.savetoCsv(datalist)
# 自定义主函数
def main(start_num,end_num):
# 头标题要只保存一次,所以再最上面保存一次,调用一次保存函数保存一下
headdata=[]
headdata.append(['价格','原价','上牌时间','车表里程','上牌地','排放量等级','变箱型号','排放量',
'过户数','看车地点','年检到期','强险','商业险','车型号','厂商','级别','发动机'])
save(headdata)
# 采用的是网页网址中页数的方式爬取多页
for i in range(start_num,end_num):
url = 'https://www.guazi.com/www/audi/o'+str(i)+'/#bread'
time.sleep(3)
print('开始爬取第',i,'页')
hreflist=gethref(url)
getdata(hreflist)
# 判断一下,防止被调用错误,多次调用
if __name__=='__main__':
main(21,51)