weixin_46663677 2020-03-28 10:44 采纳率: 0%
浏览 1324

python爬虫,使用selenium爬取某宝数据,爬虫代码能正常运行,但是控制台只打印了一个商品的信息

1、
环境:pycharm
浏览器:chrome
描述:使用selenium爬取某宝数据,爬虫代码能正常运行(可以对元素进行定位,可以下拉滑动条、可以通过修改url去到下一页),但是控制台只打印了一个商品的信息,其余爬取的信息没有被打印出来

2、代码如下:

"""
爬取淘宝商品步骤:
1、打开谷歌浏览器,访问淘宝网站:找到淘宝的 url
2、定位搜索框和搜索按钮(F12,使用元素选择器进行定位,复制 XPath),要完成的动作→输入要搜索的商品,然后点击搜索按钮
3、在登陆界面停留 10 秒,手机扫码登陆(需手动),高级一点的方法可以自送输入账号密码登陆
4、进入搜索结果页面,模仿人浏览商品时的动作→下拉滑动条到页面的最后,拉5次,拉的过程有暂停
"""
from selenium import webdriver
# 需要一款浏览器,访问淘宝网址
import time
import re
# 找到 输入框 找到 按钮
# 元素(输入框、按钮等) 定位


def search_product():
    driver.find_element_by_xpath('//*[@id="q"]').send_keys(kw)
    driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()
    # # 强行阻止程序运行 10s的时间
    time.sleep(5)
    # 获取搜索结果页面的总页码
    token = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]').text
    token = int(re.compile('(\d+)').search(token).group(1))
    return token
# 元素定位 他没有前提吗?你的网速比较慢,如果元素没有加载完毕,那么你能够去定位没有加载的数据吗?没有加载出来
# 也就是说,这个加载的过程 是因为我拉动了下滑条!
# 步骤:登录 拉动下滑条 采集数据 下一页 拉动下滑条 再采集数据,按这个循环!


def drop_down():
    # 一次拉一部分,拉的时候有暂停 range 得出 1 3 5 7 9 五个数
    for x in range(1, 11, 2):
        time.sleep(0.5)
        # j 代表滑动条的五个位置:1/10、3/10、5/10、7/10、9/10
        j = x/10
        # 下面的 js 是 JavaScript 的语法,可以当作万能公式解决大部分网站问题
        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        driver.execute_script(js)


def get_product():
    # 首先获取所有的 div ,然后遍历所有的 div ,得到一个div 再去一个 div 里面寻找需要的数据
    # // 代表任意位置(任意一个位置的属性属于 class="items" 的 div)
    # //div[@]/div[@] 代表要获取的 div 的路径
    divs = driver.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq item-ad  "]')
    for div in divs:
        # . 代表当前目录, .// 当前目录下的任意 div标签 下的 a标签 下的 img标签 下的 src
        info = div.find_element_by_xpath('.//div[@class="row row-2 title"]').text
        price = div.find_element_by_xpath('.//div[@class="price g_price '
                                          'g_price-highlight"]/strong').text + '元'
        deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text
        image = div.find_element_by_xpath('.//div[@class="pic"]/a/img').get_attribute('src')
        # name = div.find_element_by_xpath('.//div[@class="shop"/a/span[1]').text
        address = div.find_element_by_xpath('.//div[@class="row row-3 g-clearfix"]/div[@class="location"]').text
        # 定义一个字典
        product = {'标题': info, '价格': price, '订单量': deal, '图片': image, '地址': address}
        print(product)


# 淘宝的反爬很严重,所以尽量不要模拟多次点击下一页
# 采用改 url 的方法可以避免反爬:通过分析淘宝页面的 url→https://s.taobao.com/search?q=Python&s=88
# 可以得知下一页就是在 url 后面的值 +44。即第4页的 url 为 https://s.taobao.com/search?q=Python&s=132
def next_page():
    token = search_product()
    drop_down()
    get_product()
    num = 1
    while num != token:
        driver.get('https://s.taobao.com/search?q={}&s={}'.format(kw, 44*num))
        num += 1
        # time.sleep(4) 。这个方法延迟太慢了,改用下面的只能等待方法
        # 隐视等待,智能等待,最高等待时间为10s,如果超过10s,抛出异常
        driver.implicitly_wait(10)
        # 无限循环进入网页,可能造成网页卡顿!导致数据加载不出来,解决方法是加一个延迟,等数据先加载出来再操作
        drop_down()
        get_product()


if __name__ == '__main__':
    kw = input('请输入你想查询的商品:')
    driver = webdriver.Chrome()
    driver.get('https://www.taobao.com/')
    next_page()

# 这个程序可以无限制地爬取内容,淘宝无法检测出来而反爬


3、代码能正常运行,打印信息如下:
图片说明

4、求各位大神帮忙解决一下T-T

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-03-28 15:48
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序