huang7899135 2018-11-04 14:13 采纳率: 0%
浏览 846

python环境,利用selenium爬取京东手机“每种套餐”价格问题

本人零基础,大龄搬砖男自学python,所以请忽略各种拼写,命名等小细节。而且目前还不会正则表达式,所以用了xpath的方法,循环点击各套餐,然后读取价格标签的text来获取价格。但是因为不同的产品,套餐种类可能不同,例如有点手机品牌有颜色、容量、运行商,版本等套餐。为了考虑多产品的兼容性,折磨了半天时间,想到用递归的思路进行实现
目前,遇到一个问题,就是递归的终止条件问题,目前总是卡在最后一个套餐,没有读取完就结束了。请前辈支招:

 from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://item.jd.com/100000287115.html#crumb-wrap")
driver.maximize_window()
html = driver.page_source
soup=BeautifulSoup(html,'lxml')
select = soup.find("div",id="choose-attrs") #查找选择框

selectstyle = select.find_all("div",class_="li p-choose") #选择的类型有多少种,比如颜色,型号,容量等
selectstyletotal = len(selectstyle) #大类数量
print(selectstyletotal)

def sonnum(n): #n为大类编号从1开始
    '''求当前大类下面有多少个型号'''
    selectsun = selectstyle[n-1].find_all("div", class_="item")
    countsun = len(selectsun)  # 查找当前类下,有多少个型号
    return countsun

for i in range(1,selectstyletotal+1):
    print("当前为第{}类,改类有{}个型号".format(i,sonnum(i)))

def showprice(n):
    '''递归选择,并显示价格'''
    if n == 1:
        for a in range(1, sonnum(n) + 1):
            driver.find_element_by_xpath(
                '//*[@id="choose-attr-' + str(n) + '"]/div[2]/div[' + str(a) + ']').click()
            select_txt = driver.find_element_by_xpath(
                '//*[@id="choose-attr-' + str(n) + '"]/div[2]/div[' + str(a) + ']').text
            price = driver.find_element_by_xpath(
                "/html/body/div[8]/div/div[2]/div[4]/div/div[1]/div[2]/span[1]/span[2]").text
            # price_data.append(select_txt+"价格为"+price)
            print("选中{},价格为{}".format(select_txt, price))

    for i in range(1,sonnum(n)+1):
        try:
            driver.find_element_by_xpath(
                '//*[@id="choose-attr-' + str(n) + '"]/div[2]/div[' + str(i) + ']').click()
            select_txt = driver.find_element_by_xpath(
                '//*[@id="choose-attr-' + str(n) + '"]/div[2]/div[' + str(i) + ']').text
            print("选中{}".format(select_txt))
            showprice(n-1)
            price = driver.find_element_by_xpath(
                "/html/body/div[8]/div/div[2]/div[4]/div/div[1]/div[2]/span[1]/span[2]").text
        except:
            continue
        print("价格为{}".format(price))
showprice(selectstyletotal)

运行结果如下:始终有1个套餐未点击完毕,大神支招啊,
'''

图片说明

谢谢?

  • 写回答

2条回答

  • devmiao 2018-11-04 14:19
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面