爬虫案例2:滚动获取jd数据

1 工具selenium

自动化操作网页。

步骤:

  1. 导入模块:from selenium.webdriver import Chrome
  2. 创建浏览器:b = Chrome()
  3. 打开网页: b.get('https://www.jd.com')
  4. 获取网页源代码,解析:bs4
  5. 关闭浏览器: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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值