使用python利器selenium工具模拟浏览器运行并爬取淘宝商品信息
程序员文章站
2022-05-09 21:13:44
...
#导入获取浏览器驱动的模块
from selenium import webdriver
#用于获取网页元素
from selenium.webdriver.common.by import By
#webdriver.wait库负责循环等待网页加载的时间
from selenium.webdriver.support.ui import WebDriverWait
#expected_conditions类负责等待网页加载的条件
from selenium.webdriver.support import expected_conditions as Ec
#导入超时的模块
from selenium.common.exceptions import TimeoutException
#分析网页
from bs4 import BeautifulSoup
#使用nosql数据库mongodb存取数据
import pymongo
#获得谷歌浏览器的网站驱动
driver=webdriver.Chrome()
wait=WebDriverWait(driver,10)
list=[]
#商品搜索
def search(shop=None):
print('开始搜索商品....')
driver.get('http://www.taobao.com')
try:
#找到淘宝主页中的搜索框
input=wait.until(
Ec.presence_of_element_located((By.CSS_SELECTOR,'#q'))
)
#向搜索框中放入要查找的商品名称
input.send_keys(shop)
#找到淘宝主页中的搜索提交按钮
submit=wait.until(
Ec.element_to_be_clickable((By.CSS_SELECTOR,'div[class="search-button"]>button[class="btn-search tb-bg"]' ))
)
#点击按钮提交搜索
submit.click()
#调用下一个函数采集商品详细信息
get_response()
#如果超时,重新查找
except TimeoutException:
return search(shop)
#提取商品信息
def get_response():
print('已经找到该商品')
# wait.until(
#
# Ec.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))
# )
#获取跳转成功后的网页源代码
html=driver.page_source
#用bs4解析网页
soup=BeautifulSoup(html,'lxml')
#获取商品信息所在的div
items=soup.find('div',class_='m-itemlist').find_all('div',class_='item')
#遍历所有商品,获取详细信息
for item in items:
product={
'image':item.find('a').find('img')['src'].strip(),
'price':item.find('div',class_='price g_price g_price-highlight' ).text.strip(),
'number':item.find('div',class_='deal-cnt').text[:-3].strip(),
'title':item.find('div',class_='row row-2 title').text.strip(),
'location':item.find('div',class_='location').text.strip()
}
print(product)
list.append(product)
#分页功能
def next_page(page):
print('当前是第{}'.format(page),'页')
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)#输入框中放入内容
submit.click()
wait.until(
#判断某个元素中的text是否包含了预期的字符串,也就是页数
Ec.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page))
)
get_response()
except TimeoutException:
return next_page(page)
# 存入到mongodb数据库中
def save_into_mongo(list):
#创建数据库连接
client=pymongo.MongoClient('localhost')
#创建数据库
db=client['taobao']
#创建数据表
content=db['info']
#数据插入到数据表中
content.insert(list)
if __name__=='__main__':
shop=input('输入名字:')
search(shop)
for i in range(2,5):
next_page(i)
# save_into_mongo(list)