python+selenium爬取淘宝商品信息+淘宝自动登录——爬虫实战

1.前言

继续学习爬虫内容,这回是以selenium模拟操作进行抓取,其中有几个需要登陆的注意事项。

2.自动登陆+查找页面

由于现在淘宝的反爬机制,需要登陆才好下一步操作。在搜索输入后页面会调入登陆界面,经过测试发现微博登陆是不需要验证码的,如果使用账号密码登陆是要滑动,但反爬更加严格,笔者暂时没有解决。也尝试过加cookie,也失败了。因此最好的方法还是利用微博账号自动登录。

登录后获取总页数,并返回。

代码如下:

def search_page():
    browser.get('https://www.taobao.com')
    #sleep(5)
    input = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#q')))
    #submit = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR,"#J_TSearchForm > div.search-button"))
    browser.find_element_by_name('q').send_keys('美食')
    browser.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()  ##搜索按钮
    sleep(3)
    #选择微博登录
    browser.find_element_by_xpath('//*[@id="J_OtherLogin"]/a[1]').click() 
    #自动填入账号密码
    browser.find_element_by_name('username').send_keys('微博账号')
    browser.find_element_by_name('password').send_keys('微博密码')

    #a=input('请输入验证码:',) #如果有验证码,注释去掉
    #browser.find_element_by_name('verifycode').send_keys(a)
    #点击登陆
    browser.find_element_by_xpath('//*[@id="pl_login_logged"]/div/div[7]/div[1]/a').click()
    sleep(5)
    totalPage = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.total')
    return totalPage.text

3.自动翻页

自动翻页的操作原理是在下方的翻页按钮除读取高亮显示的页面(即代表目前页面),清除输入页面框内的数字,再填入下一页数字,再点击确定即可翻页。

代码如下:

def next_page(page_number):
    try:
        get_products()
        inputFrame = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input')))
        submitButton = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))
        inputFrame.clear()
        inputFrame.send_keys(page_number)
        submitButton.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 TimeoutException:
        next_page(page_number)

4.获取产品信息

查看每个产品的属性即可,分别放入字典并写入文件。

def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
    doc = pq(browser.page_source)
    items = doc('#mainsrp-itemlist .items .item').items() #生成迭代器
    for item in items:
        img = "https:" + item.find('.pic .img').attr('src')
        product = {
            'img':img,
            'price':item.find('.price g_price').text(),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        with open("/。。。/products.txt", 'a') as f:
            f.write(str(product) + '\n' + '\n')

5.主程序

使用一个循环将所有页面的产品写入即可。

def main():
    totalpage = search_page()
    totalpage = int(re.compile(r'(\d+)').search(totalpage).group(1))
    for i in range(2, totalpage+1):
        next_page(i)

你可能感兴趣的:(爬虫实战)