模拟浏览器抓取淘宝书籍数据

淘宝的html是动态加载的,直接用requests请求并不能找到想要的数据,这里用selenium库模拟浏览器登录并操作


导库

from selenium import webdriver

淘宝的url

url ='https://www.taobao.com/'
browser = webdriver.Chrome()
browser.get(url)

用css选择器获取淘宝搜索框并输入“书籍”(也可以输入其他的关键字,网页的结构一样的)

inputs = browser.find_element_by_css_selector('#q')
inputs.send_keys('书籍')

找到搜索键,并点击

submit = browser.find_element_by_css_selector('#J_TSearchForm > div.search-button > button')
submit.click()

模拟翻页,找到‘到【】页’的搜索框,清空页码值,并增加页码的值,最后找到‘确定’键点击,实现翻页 

inputs1 = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > input')
inputs1.clear()
page_num = 2
inputs1.send_keys(page_num)
submit1 = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')
submit1.click()

上述代码表示翻到第2页


bookname = browser.find_elements_by_css_selector('.J_ClickStat')
print(bookname)

成功返回html,是list的格式


查看找到的书名

for name in bookname:
    print(name.text)

返回成功


同样的方式找到书籍的价格信息

price = browser.find_elements_by_css_selector('strong')
#print(price)
for price in price:
    print(price.text)

返回成功


获取单页的html,并抓取书籍的书店名字,书店的地点,书籍的价格,书籍的销量

定义获取单页的函数,解析html,放在字典的生成器中

def get_one_page(page_num):
    inputs1 = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > input')
    inputs1.clear()
    page_num = page_num
    inputs1.send_keys(page_num)
    submit1 = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')
    submit1.click()
    booklist= browser.find_elements_by_css_selector('.J_MouserOnverReq')
    for book in booklist:
        yield {'price' : book.find_element_by_css_selector('strong').text,
               'deal_num' : book.find_element_by_css_selector('.deal-cnt').text[:-3],
               'shopname' : book.find_element_by_css_selector('.shopname').text.strip(),
               'location' : book.find_element_by_css_selector('.location').text
              }

试试看返回第3页的数据

for i in get_one_page(3):
    print(i)
京创新华图书专营店 黑龙江 哈尔滨 39.80 3327
三辰图书专营店 湖北 武汉 38.80 1497
华鼎文创图书专营店 北京 68.80 208
世纪慧泉图书音像专营店 福建 厦门 75.80 86
豫仁培博图书专营店 河南 新乡 29.80 2380
西林图书专营店 安徽 合肥 169.00 375
互优图书专营店 北京 29.80 4475
书山有路图书专营店 北京 99.00 190
读品图书专营店 北京 64.00 2867
融鼎图书专营店 江苏 淮安 32.80 302
盛世九九图书专营店 北京 29.80 5197
时代新知图书专营店 北京 79.80 342
山东书虫图书专营店 山东 济南 52.50 4411
宇光魅图书专营店 湖南 长沙 28.80 10985
凤凰新华书店旗舰店 江苏 南京 89.10 362
杭州爱来屋图书专营店 浙江 杭州 33.80 4404
中昊欣彩图书专营店 北京 48.00 561
警苑图书专营店 北京 39.80 25864
邦雅图书专营店 北京 98.00 1731
青青书坊图书专营 重庆 24.90 2145
博库图书专营店 浙江 杭州 24.50 1310
当当网官方旗舰店 北京 339.30 506
当当网官方旗舰店 北京 25.60 11192
中少金开明图书专营店 北京 26.50 1946
爱的书房图书专营店 浙江 杭州 55.00 996
卓越书香图书专营店 北京 58.00 1817
宏坤图书音像专营店 北京 72.00 734
弗洛拉图书专营店 山东 济南 27.80 4647
新华文轩网络书店 四川 成都 177.00 702
新华文轩网络书店 四川 成都 44.80 1288
晋源图书专营店 江苏 南京 42.00 978
至诚经典图书专营店 河南 郑州 299.00 59
融鼎图书专营店 江苏 淮安 44.60 270
世纪慧泉图书音像专营店 福建 厦门 39.00 1071
凯福图书专营店 北京 57.80 542
逸观图书专营店 浙江 杭州 29.80 3608
思远图书专营店 北京 239.00 165
熙丽百川图书专营店 湖北 武汉 69.90 10639
新又雅图书专营店 广东 广州 53.80 1532
锦瑭图书专营店 北京 37.00 259
品悦轩图书专营店 北京 23.00 506
翰墨怡香图书专营店 北京 55.80 268
伙伴组合 北京 45.00 809
弘图图书专营店 安徽 合肥 174.30 594

返回成功


我们需要把数据从字典格式转为dataframe格式,最后保存为csv格式文件

定义字典到datafram转换的函数

def to_df(page_num):
    items = get_one_page(page_num)
    time.sleep(1)
    lis =[]
    for item in items:
        lis.append(item)
    data = pd.DataFrame(lis)
    return data

总共有100页,返回每页的数据,合并不同页的datafram

def data_df():
    df = to_df(1)
    for i in range(2,101):
        time.sleep(2)
        dfi = to_df(i)
        if i%5 ==0:
            print('正在合并第%d页...'%i)
        df = df.append(dfi,ignore_index = True)
    return df

保存为csv

def save_csv():
    df = data_df()
    df.to_csv(r'C:\Users\Administrator\Desktop\书籍.csv',encoding ='gb18030',index = False)
    

注意要用gb18030,抓取的数据有特殊字符

save_csv()
正在合并第5页...
正在合并第10页...
正在合并第15页...
正在合并第20页...
正在合并第25页...
正在合并第30页...
正在合并第35页...
正在合并第40页...
正在合并第45页...
正在合并第50页...
正在合并第55页...
正在合并第60页...
正在合并第65页...
正在合并第70页...
正在合并第75页...
正在合并第80页...
正在合并第85页...
正在合并第90页...
正在合并第95页...
正在合并第100页...


抓取完成,共4393条数据



保存为csv。


代码总览

from selenium import webdriver
from bs4 import BeautifulSoup
from multiprocessing import Pool
import pandas as pd
import time


url ='https://www.taobao.com/'
browser = webdriver.Chrome()
browser.get(url)
inputs = browser.find_element_by_css_selector('#q')
inputs.send_keys('书籍')
submit = browser.find_element_by_css_selector('#J_TSearchForm > div.search-button > button')
submit.click()

def get_one_page(page_num):
    inputs1 = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > input')
    inputs1.clear()
    page_num = page_num
    inputs1.send_keys(page_num)
    submit1 = browser.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')
    submit1.click()
    time.sleep(2)#休息2秒,加载太快,元素定位不到
    doc = browser.page_source
    soup = BeautifulSoup(doc,'lxml')
    booklist = soup.select('.J_MouserOnverReq')
    for book in booklist:
        yield {'price' : book.select('strong')[0].text,
               'deal_num' : book.select('.deal-cnt')[0].text[:-3],
               'shopname' : book.select('.shopname')[0].text.strip(),
               'location' : book.select('.location')[0].text
              }
    
    


    
        
def to_df(page_num):
    items = get_one_page(page_num)
    time.sleep(1)
    lis =[]
    for item in items:
        lis.append(item)
    data = pd.DataFrame(lis)
    return data


def data_df():
    df = to_df(1)
    for i in range(2,101):
        time.sleep(2)
        dfi = to_df(i)
        if i%5 ==0:
            print('正在合并第%d页...'%i)
        df = df.append(dfi,ignore_index = True)
    return df

def save_csv():
    df = data_df()
    df.to_csv(r'C:\Users\Administrator\Desktop\书籍.csv',encoding ='gb18030',index = False)
    
save_csv()
需要注意的是,每次翻页的时候注意time.sleep(2),因为翻页太快,网页还没加载出来,元素定位不到会报错,另外需要注意的是encoding要是gb18030,否则保存的时候可能出错。



猜你喜欢

转载自blog.csdn.net/weixin_40300458/article/details/79996201