Python爬虫爬取淘宝商品信息 - Go语言中文社区

Python爬虫爬取淘宝商品信息


selenium库可以驱动浏览器自动进行页面的访问代码参考《Python3网络爬虫开发实战》崔庆才著)

1.驱动浏览器访问淘宝页面

browser=webdriver.Chrome()
wait=WebDriverWait(browser,10)
def search():
    try:
        url="https://www.taobao.com"
        browser.get(url)
        #获取输入框
        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('美食')
        #点击确定
        submit.click()
        #获取当前商品的总页数
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
        return total.text
    except:
        search()

2.登录模块

淘宝设置了登录后才可以查看商品信息,这对爬虫来说无疑增大了很大的难度,我尝试使用selenium方法输入账号密码,但是输入后仍然需要滑块检验才能登录,这一部分还不太会,以后再学,所以就偷懒的手动登录了。。。

3.翻页操作

在上一步我们已经获取了商品的总页面数,那么接下来我们需要做的就是从第一页开始逐个翻页;

观察淘宝的分页部分:

我们可以用两种方法进行翻页,第一种是不断点击下一页进行翻页;第二种是在输入框中输入具体的页面号后点击确定进行翻页;在这里我们使用第二种方法,因为在第一种方法中,如果某一页出现了错误,那么继续点击下一页的话,后边所有的页面都会出错。

还有一点需要注意,如何验证我们的翻页操作是否正确?

在这里我们使用的方法是:判断页面高亮部分和我们在函数中传入的实际页面数是否相等。

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)))
    except:
        next_page(page_number)

4.商品信息解析

使用pyquery进行商品信息解析
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()#得到所有宝贝的内容
    for item in items:
        product={
            'image':item.find('.pic .img').attr('data-src'),#图片链接
            'price':item.find('.price').text(),#商品价格
            'deal':item.find('.deal-cnt').text()[:-3],#付款人数,-3是为了去掉人付款这几个字
            'title':item.find('.title').text(),#商品名称
            'shop':item.find('.shop').text(),#店铺名称
            'location':item.find('.location').text()
        }
        print(product)

5.完整代码

import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq

browser=webdriver.Chrome()
wait=WebDriverWait(browser,10)
def search():
    try:
        url="https://www.taobao.com"
        browser.get(url)
        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('美食')
        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:
        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:
        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()#得到所有宝贝的内容
    for item in items:
        product={
            'image':item.find('.pic .img').attr('data-src'),#图片链接
            'price':item.find('.price').text(),#商品价格
            'deal':item.find('.deal-cnt').text()[:-3],#付款人数,-3是为了去掉人付款这几个字
            'title':item.find('.title').text(),#商品名称
            'shop':item.find('.shop').text(),#店铺名称
            'location':item.find('.location').text()
        }
        print(product)

def main():
    total=search()
    total=int(re.compile('(d+)').search(total).group(1)) #转换为数值型
    print(total)
    for i in range(2,total+1):
        next_page(i)

if __name__=='__main__':
    main()

运行结果

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_38290604/article/details/89306161
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 13:43:58
  • 阅读 ( 999 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢