使用selenium爬取淘宝首页失败,请教大神解答

2021-02-20 10:10发布

按照书上方法对淘宝首页的有好货内容进行爬取,使用xpath进行解析,但是返回为空

使用xpath helper可以正常提取,我在返回的res 中进行搜索,也找不到 内容 。。。

有没大神能解答下


按照书上方法对淘宝首页的有好货内容进行爬取,使用xpath进行解析,但是返回为空

使用xpath helper可以正常提取,我在返回的res 中进行搜索,也找不到 内容 。。。

有没大神能解答下


7条回答
是开心果呀 - 热爱生活
2楼-- · 2021-02-20 12:08

淘宝页面是异步加载的  所以不能直接翻页到底部,要一部分一部分翻页

我是大脸猫 - 峡谷钢琴家
3楼-- · 2021-02-20 17:23

爬取淘宝美食

操作流程:1.搜索关键字,利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
2.得到商品页码数,模拟翻页,得到后续页面的商品列表
3.分析提取商品内容,利用pyquery分析源码,解析得到商品列表
4.存储至mongodb

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from pyquery import PyQuery as pq
from config import *
import pymongo
client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

chrome_diver="E:\Googedownload\chromedriver_win32\chromedriver.exe"
browser=webdriver.Chrome(executable_path=chrome_diver)
wait=WebDriverWait(browser,10)

def search():#获取首页数据
    try:
        browser.get('https://www.taobao.com')
        input=wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
        )
        submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
        input.send_keys('美食')
        #time.sleep(10)
        submit.click()
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
        get_products()
        return total.text
    except TimeoutException:
        return search()
def next_page(page_number):#翻页
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
        )
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
        input.clear()
        input.send_keys(page_number)
        submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))
        get_products()
    except TimeoutException:
        next_page(page_number)
def get_products():#获取商品信息
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    html=browser.page_source
    doc=pq(html)
    items=doc('#mainsrp-itemlist .items .item').items()#items可以返回所有的内容
    for item in items:
        product={
            'image':item.find('.pic .img').attr('src'),
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        save_to_mongo(product)
def save_to_mongo(result):#参数就是字典
    try:
        if db[MONGO_TABLE].insert(result):
            print('存储成功',result)
    except Exception:
        print('失败',result)
def main():
    try:
        total=search()
        total=int(re.compile('(\d+)').search(total).group(1))
        for i in range(2,total+1):
            next_page(i)
    except Exception:
        print('出错了')
    finally:
        browser.close()
if __name__ == '__main__':
    main()


小磊子
4楼-- · 2021-02-22 09:59

前两天写分析ajax爬虫,是分析了网站请求的参数、请求地址、上传的表单,模拟浏览器访问页面来的到源码,但是有时候ajax的参数非常多,而且经过加密,很难找到规律。这时候我们就需要使用selenium这个强大的库了,它可以控制浏览器,模拟人的操作,直接获取浏览器渲染完成后的页面源码,真正做到可见即可爬。

不多说,让我们开始吧!
selenium需要我们配合浏览器使用,它支持很多款浏览器,但是我更喜欢chrome,因为它调试起来更方便,就像很多前段程序猿也喜欢chrome一样,反正我不喜欢IE,让它当场去世吧!

chromeDriver  也是必需品。下载下来后放在环境的script文件下。

这次也是,还是剩下一小部分没完成,现在还没学习到。之后会完善。

  • 搜索商品后会直接跳到登录界面,所以我直接打开的登录界面,现在我只能扫码登陆,账号密码登陆会出滑动验证码,这在ChromeDriver里无法完成,我就直接等10s让我扫码登陆了。

其实吧我感觉爬虫没什么好讲的,主要是对抗反爬机制能够给我带来快乐。这次淘宝的反爬很厉害。换页的速度不能太快,太快的话,到18页就会被要求进行滑动验证,但是由于浏览器问题,总是失败。所以我在换页之前用了10s的延时才能全部爬下来。

一共爬了100页,我输入的‘ipad’,一共4404条数据,全部存在数据库中,方便以后使用:

image.png

结果

[图片上传失败...(image-e5e97b-1553952994597)]

这次的程序中设计等待时间的概念,一个是隐式等待,一个是显示等待。
隐式等待就是等待给定的时间,在寻找页面中的元素,如果时间到了还没加载出来,就报错,这一般用的少,但这次我也用了,在扫码登录的时候。
显示等待是指如果再规定的时间内加载出来了,就获取节点,如果没有加载出来报错。

代码不长,具体内容就不讲了,没意思。你爬虫遇到问题了,来对比下,找找不同,这样才能得到最大的进步,什么都直接说出来,就没有找答案的这个过程,也就没有任何的成就感,而且我写这个,只是我为了记录自己的学习过程。最终虽然得到了我想要的,但反爬机制没解决,感觉得到之后一切都变得索然无味。

还有就是浏览器滑动验证这一点,这将是我接下来的学习方向,之后就可以为所欲为了。

import reimport timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqfrom config import *import pymongo# chrome_options = webdriver.ChromeOptions()# chrome_options.add_argument()browser = webdriver.Chrome()wait = WebDriverWait(browser, 10)client = pymongo.MongoClient(MONGODB_HOST, MONGODB_POST)db = client[MONGODB_DB]collection = db[MONGODB_COLLECTION]def login():
    print("正在登录")
    # 需要用手机淘宝扫二维码登录才能搜索
    browser.get(url='https://login.taobao.com')
    # 10s用来扫码登录
    browser.implicitly_wait(10)def search():
    print("正在查找",KEYWORD)
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
        )
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
        )
        input.send_keys(KEYWORD)
        submit.click()
        total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
                                                    "#mainsrp-pager > div > div > div > div.total")))
        get_goods()
        return total.text    except TimeoutError:
        return search()def next_page(page_number):
    print("正在换页", page_number)
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
        )
        submit = wait.until(
            EC.element_to_be_clickable(
                (By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
        )
        input.clear()
        input.send_keys(page_number)
        submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,
                                                     '#mainsrp-pager > div > '\                                                     'div > div > ul > '\                                                     'li.item.active > '\                                                     'span'), str(page_number)))
        get_goods()
    except Exception:
        next_page(page_number)def get_goods():
    try:

        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
                                                   '#mainsrp-itemlist .items '
                                                   '.item')))
        html = browser.page_source
        doc = pq(html)
        items = doc('#mainsrp-itemlist .items .item').items()
        for item in items:
            goods = {
                'img': item.find('.pic .img').attr('data-src'),
                'price': item.find('.price').text(),
                'deal': item.find('.deal-cnt').text(),
                'title': item.find('.title').text(),
                'shop': item.find('.shop').text(),
                'location': item.find('.location').text()
            }
            save_to_mongodb(goods)
    except Exception:
        print("获取商品失败")def save_to_mongodb(result):
    try:
        if db[MONGODB_COLLECTION].insert_one(result):
            print("存储到数据成功", result)
    except Exception:
        print("存储到数据库失败", result)def main():
    login()
    total = search()
    total = int(re.compile('(\d+)').search(total).group(0))
    for i in range(2, total + 1):
        if i % 15 == 0:
            time.sleep(20)
        next_page(i)if __name__ == '__main__':
    main()

在使用前一定要记得把该装的库都装了,数据库打开,网络通畅。



作者:DKider
链接:https://www.jianshu.com/p/6b368b61649f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


kitidog2016
5楼-- · 2021-02-22 13:59

爬取淘宝美食

操作流程:1.搜索关键字,利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
2.得到商品页码数,模拟翻页,得到后续页面的商品列表
3.分析提取商品内容,利用pyquery分析源码,解析得到商品列表
4.存储至mongodb


722
6楼-- · 2021-02-22 14:31

爬取淘宝美食

操作流程:1.搜索关键字,利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
2.得到商品页码数,模拟翻页,得到后续页面的商品列表
3.分析提取商品内容,利用pyquery分析源码,解析得到商品列表
4.存储至mongodb

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from pyquery import PyQuery as pq
from config import *
import pymongo
client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

chrome_diver="E:\Googedownload\chromedriver_win32\chromedriver.exe"
browser=webdriver.Chrome(executable_path=chrome_diver)
wait=WebDriverWait(browser,10)

def search():#获取首页数据
    try:
        browser.get('https://www.taobao.com')
        input=wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
        )
        submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
        input.send_keys('美食')
        #time.sleep(10)
        submit.click()
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
        get_products()
        return total.text
    except TimeoutException:
        return search()
def next_page(page_number):#翻页
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
        )
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
        input.clear()
        input.send_keys(page_number)
        submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))
        get_products()
    except TimeoutException:
        next_page(page_number)
def get_products():#获取商品信息
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    html=browser.page_source
    doc=pq(html)
    items=doc('#mainsrp-itemlist .items .item').items()#items可以返回所有的内容
    for item in items:
        product={
            'image':item.find('.pic .img').attr('src'),
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        save_to_mongo(product)
def save_to_mongo(result):#参数就是字典
    try:
        if db[MONGO_TABLE].insert(result):
            print('存储成功',result)
    except Exception:
        print('失败',result)
def main():
    try:
        total=search()
        total=int(re.compile('(\d+)').search(total).group(1))
        for i in range(2,total+1):
            next_page(i)
    except Exception:
        print('出错了')
    finally:
        browser.close()
if __name__ == '__main__':
    main()


不吃鱼的猫
7楼-- · 2021-02-22 16:56

1.利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
2.模拟翻页,得到后续页面的商品列表
3.利用pyquery分析源码,解析得到商品列表
4.存储至mongodb

帅帅马
8楼-- · 19小时前

爬取淘宝美食

操作流程:1.搜索关键字,利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
2.得到商品页码数,模拟翻页,得到后续页面的商品列表
3.分析提取商品内容,利用pyquery分析源码,解析得到商品列表
4.存储至mongodb

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from pyquery import PyQuery as pq
from config import *
import pymongo
client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

chrome_diver="E:\Googedownload\chromedriver_win32\chromedriver.exe"
browser=webdriver.Chrome(executable_path=chrome_diver)
wait=WebDriverWait(browser,10)

def search():#获取首页数据
    try:
        browser.get('https://www.taobao.com')
        input=wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
        )
        submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
        input.send_keys('美食')
        #time.sleep(10)
        submit.click()
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
        get_products()
        return total.text
    except TimeoutException:
        return search()
def next_page(page_number):#翻页
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
        )
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
        input.clear()
        input.send_keys(page_number)
        submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))
        get_products()
    except TimeoutException:
        next_page(page_number)
def get_products():#获取商品信息
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    html=browser.page_source
    doc=pq(html)
    items=doc('#mainsrp-itemlist .items .item').items()#items可以返回所有的内容
    for item in items:
        product={
            'image':item.find('.pic .img').attr('src'),
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        save_to_mongo(product)
def save_to_mongo(result):#参数就是字典
    try:
        if db[MONGO_TABLE].insert(result):
            print('存储成功',result)
    except Exception:
        print('失败',result)
def main():
    try:
        total=search()
        total=int(re.compile('(\d+)').search(total).group(1))
        for i in range(2,total+1):
            next_page(i)
    except Exception:
        print('出错了')
    finally:
        browser.close()
if __name__ == '__main__':
    main()