滚动获取jd数据
1 工具selenium
自动化操作网页。
步骤:
- 导入模块:
from selenium.webdriver import Chrome
- 创建浏览器:
b = Chrome()
- 打开网页:
b.get('https://www.jd.com')
- 获取网页源代码,解析:
bs4
- 关闭浏览器:
b.close()
2 滚动浏览器操作
滚动浏览器,修改x方向偏移量,窗口左右移动;修改y方向偏移量,窗口上下滚动。我们在获取数据的过程中,需要等待数据加载完成才能拿到数据,因此一般滑动的时候,x和y的值不宜设太大,多循环使用,一次滑一点,等待1秒,sleep一下,等数据加载出来,再继续滑动;一次滑动太大,数据一下子加载不出来,就拿不到数据。
固定结构:
window.scrollBy(x方向偏移量,y方向偏移量)
b.execute_script('window.scrollBy(0,800)')
3 jd示例
使用selenium打开jd首页,通过find_element_by_id找到输入框,数据数值,回车,来到详情页。向下滑动,直到最后,整个页面加载完成,解析页面,拿到商品的标题、价格、店铺名称等信息;找到下一页按钮,点击按钮,进入商品下一页的数据页,向下滚动,重复之前的操作,拿到需要的数据。
move_page()函数:滚动到页面最底部
get_data()函数:解析加载出来的数据信息,返回商品数据列表
num_page(num1)函数:可以选择输入页数,获取num1页的数据
完整代码如下:
from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
import csv
# 滚动一页
def move_page():
for x in range(14):
b.execute_script('window.scrollBy(0,700)')
sleep(1)
# 解析数据
def get_data(html: str):
soup = BeautifulSoup(html, 'lxml')
goods_li = soup.select('#J_goodsList>ul>li')
for goods in goods_li:
price = goods.select_one('.p-price i').text
title = goods.select_one('.p-name.p-name-type-2 em').text.replace(' ', '').replace('\n', '')
shop = goods.select_one('.p-shop>span>a').text
shop_data.append([title, price, shop])
return shop_data
# 输入选择滚动多少页
def num_page(num1:int):
for i in range(num1):
# 滚动页面
move_page()
# 解析数据
get_data(b.page_source)
# 遇到下一页按钮
btn = b.find_element_by_class_name('pn-next')
# 点击下一页
btn.click()
sleep(2)
# 滚动的最后一页
if i == num1 - 1:
break
if __name__ == '__main__':
b = Chrome()
b.get('https://www.jd.com')
b.find_element_by_id('key').send_keys('电脑\n')
sleep(1)
shop_data = []
num_page(3)
with open('jd数据.csv', 'w', encoding='utf-8', newline='') as f:
wirte = csv.writer(f)
wirte.writerow(['标题', '价格', '店铺'])
wirte.writerows(shop_data)
input('关闭:')
b.close()