# 动作链
# 反爬的一种手段,通过移动图片来进行反爬
from selenium import webdriver # 声明一个浏览器对象
from selenium.webdriver import ActionChains
import time
import pandas as pd
from bs4 import BeautifulSoup
from selenium.webdriver.common.alert import Alert
# 和上面的结果一样
# 无界面显示
# 如果不打开网页界面,则下面添加下面两行,如果需要显示,则注释掉即可
chrome_options = webdriver.ChromeOptions() # 定义一个对象
chrome_options.add_argument('--headless') # 无界面显示
# 爬取京东商品,多页
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_1e919057477d404cbad2c4880ced4af4'
browser.get(url)
browser.maximize_window() # 最大化
input = browser.find_element_by_id('key')
input.clear()
input.send_keys('手机')
browser.find_element_by_class_name('button').click()# 回车
# 上面的网址,打开方式都是一样的,所以不用每次都打开
# 数据保存
datalist = []
for i in range(5): # 循环5次爬取5页
print('正在爬取第%d页'%(i + 1))
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 下拉进度条
time.sleep(10)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(10)
html = browser.page_source # 获取网页的源码
soup = BeautifulSoup(html, 'html.parser') # 内置的标准库对网页解析
# 查找所有的元素
li = soup.find_all(name='li', class_ ='gl-item')
# 储存数据
for ll in li:
# 标题
title = ll.find('div','p-name').em.text
# 价格
price = ll.find('div','p-price').i.text
#店铺名字
if ll.find('span','J_im_icon') == None:
shop_name = '京东自营'
else:
shop_name = ll.find('span','J_im_icon').text.strip()
# 数据保存
datalist.append([title, price, shop_name])
browser.execute_script('window.scrollTo(0,10000)') #当爬完所有的数据后,将浏览器上升到y轴10000的地方,因为下一页的按钮就在10000附近
time.sleep(5)
browser.find_element_by_class_name('pn-next').click()# 找到下一页的按钮并且点击
time.sleep(5)
print('爬取完成')
df = pd.DataFrame(datalist, columns=['标题', '价格', '店铺名字'])
df.to_csv('./京东手机浏览页.csv',index = False)