淘宝的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,否则保存的时候可能出错。