大家好 五一长假过后!!我绿某人 !又回来啦!我仍然努力维持着 我一周一更的传统哈!今天这篇文章 我想搞点不一样的 干货还是那个干货 只不过我不会再瞎唠嗑 我直接讲知识点吧 我想看看会不会有什么不一样的效果!
最后一目录可直接获取源码
部分知识点来源于网络 如侵立删
在一些网站中多多少少都可以通过requests或者ajax来实现数据的抓取 但是不是全部的页面都是通过AJAX渲染这一种 比如一些网站部门代码就是通过JS计算生成的 淘宝和京东这类的页面中ajax更是包含了许多加密参数 这个时候就要用到selenium爬虫了。
这边简单介绍一下selenium爬虫 就是通过模拟人的行为来浏览网站 做到所见即所爬 就是不管你界面是怎么样渲染的 我都能获取到网页的源码内容 是一个相当不错的工具了。
而selenium爬虫也有劣势,在于速度较慢 但是好像可以通过多线程提升速度?后面我学习到了再来跟大家分享方法
记得需要提前安装好浏览器的驱动
在selenium方法下不是传入url而是通过模拟浏览器的操作来获取当前页面 。就是说先实例化一个webdriver的对象假如叫小绿 之后浏览到那个页面 小绿表示的就是哪一个页面的网址了 相当于一个不显示网址的url(这样说应该知道了吧?)
学过web前端开发的应该熟悉一种方式就是通过JS语言来操控html实现渲染 而selenium可以执行JS操作 这是selenium的强大之处之一(这个以后有机会我在和大家说)
代码如下:
driver = webdriver.Chrome()#我叫小绿!!
driver.get('https://www.jd.com/')#小绿去了 https://www.jd.com这个页面 那我现在表示的就是这个页面的url了
因为selnium算是模拟人的行为实现爬虫的工具包 所以在这里我们需要先像人一样获取输入框 在获取点击框 然后再输入内容 点击。
def spider(keyword):
input_tag = driver.find_element_by_id('') # 获取输入框
input_tag.send_keys(keyword) # 输入 关键字
input_tag.send_keys(Keys.ENTER) # 发送关键词
time.sleep(5) # 等待
return driver # 返回页面 此时页面为第一页面
#注:driver就相当于一个看不见的url 你执行到那 他就在那 比如你在京东第一页的页面中 driver就表示当前页面 所在url即当前页面
翻页设置
本文章中使用的翻页是点击下一页 但一般来说使用页面底部输入页码即可跳转到相应页面的设定才是最好的 大家可以去了解下 我当初写的时候有个bug我没弄出来 所以我才采用了点击下一页的方法。
这里分享一个文章链接他就是使用点击的方法实现跳转 大家可以去看一下
引用文本
链接: https://blog.csdn.net/Yk_0311/article/details/83211979.
i = 1#这里可以类似于判断是不是在第一页了
while (i ):
if (i == 1):
print('现在是第', i, '页')
get_goods(page) # 如果是第一页 直接分析
csv_wirte()#然后写入文件
i = i + 1
else:
# 如果不是第一页 则在第一页的基础上 获取下一页按钮
#等待页面元素加载出来后 然后点击下一页按钮
button = page.find_element_by_partial_link_text('下一页').click()#使用
time.sleep(2)
print('现在是第', i, '页')
get_goods(page)
csv_wirte()
i = i + 1
这里的页面解析有一个需要注意点的就是 如果进入页面不下拉页面到底部就只能加载部分商品
我们一直拉到底部 才可以加载全部商品。
def get_goods(driver):
#这个就是selnium执行的JS操作了 那是相当不错
for i in range(1, 3): # 将页面拖拽到底部,页面全部加载出来,不然后面找不到其他产品的信息
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(1)
goods = driver.find_elements_by_class_name('gl-item') # 获取那一页的所有列表链接
for good in goods: # 遍历
data_dict = {}
#名字
data_dict['名字'] = good.find_element_by_class_name('p-name em').text.replace('\n', '')
#链接
data_dict['链接'] = good.find_element_by_tag_name('a').get_attribute('href')
# 价格
data_dict['价格'] = good.find_element_by_class_name('p-price i').text
# 评论
data_dict['评论数'] = good.find_element_by_class_name('p-commit a').text
data_list.append(data_dict)
print(data_dict)
在文件数据内容不多的情况下我是喜欢使用csv写入方法的
def csv_wirte():
with open('京东.csv', 'w', encoding='utf-8', newline='') as f: #创建了个文件 作为f
title = data_list[0].keys() # 表头
# 创建writer对象
writer = csv.DictWriter(f, title) # 写入表头
#写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
# !/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv
data_list = []
driver = webdriver.Chrome()
driver.get('https://www.jd.com/')
# 这一部分 相当于全部函数都可以调用
def spider(keyword):
input_tag = driver.find_element_by_id('') # 获取输入框
input_tag.send_keys(keyword) # 输入 关键字
input_tag.send_keys(Keys.ENTER) # 发送关键词
time.sleep(5) # 等待
return driver # 返回页面 此时页面为第一页面
def get_goods(driver):
#这个就是selnium执行的JS操作了 那是相当不错
for i in range(1, 3): # 将页面拖拽到底部,页面全部加载出来,不然后面找不到其他产品的信息
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(1)
goods = driver.find_elements_by_class_name('gl-item') # 获取那一页的所有列表链接
for good in goods: # 遍历
data_dict = {}
#名字
data_dict['名字'] = good.find_element_by_class_name('p-name em').text.replace('\n', '')
#链接
data_dict['链接'] = good.find_element_by_tag_name('a').get_attribute('href')
# 价格
data_dict['价格'] = good.find_element_by_class_name('p-price i').text
# 评论
data_dict['评论数'] = good.find_element_by_class_name('p-commit a').text
data_list.append(data_dict)
print(data_dict)
def csv_wirte():
with open('京东.csv', 'w', encoding='utf-8', newline='') as f: #创建了个文件 作为f
title = data_list[0].keys() # 表头
# 创建writer对象
writer = csv.DictWriter(f, title) # 写入表头
#写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
def main(n): # n为页面
page = spider(keyword='口罩') #关键词为口罩 先进入第一页
i = 1#判断页面是否为第一页
while (i):
if (i == 1):
print('现在是第', i, '页')
get_goods(page) # 如果是第一页 直接分析
csv_wirte()
i = i + 1
else:
# 如果不是第一页 则在第一页的基础上 获取下一页按钮
#等待页面元素加载出来后 然后点击下一页按钮
button = page.find_element_by_partial_link_text('下一页').click()
time.sleep(2)
print('现在是第', i, '页')
get_goods(page)
csv_wirte()
i = i + 1
driver.close()
main(2)# 2 想要抓取的页面数
最近比较忙了 接了一些单子 但是还是会努力更新 跟大家分享学习方法与心得的 祝大家好梦 晚安!