这一节利用selenium爬取淘宝商品信息并保存至mongodb数据库
1.分析链接
打开淘宝网,我们在搜索框搜索ipad,产生链接为 https://s.taobao.com/search?q=ipad
需要获取的信息有商品图片,价格,标题,地址等信息,如下图所示。
在这里,我们爬取的页数按照跳转页数计算防止部分界面数据不稳定造成后续爬取失败。
2.代码实现
首先,我们获取商品列表,代码如下:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
wait = WebDriverWait(browser,12)
KEYWORD = 'ipad'
def index_page(page): #获得商品列表
print('正在爬取第',page,'页')
try:
url = 'https://s.taobao.com/search?q='+ quote(KEYWORD)
browser.get(url)
if page > 1:
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q')))
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager div.form > span.btn.J_Submit')))
input.clear()
input.send_keys(page)
submit.click()
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager li.item.active > span'),str(page)))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.m-itemlist .items .item')))
get_products()
except TimeoutException:
index_page(page)
【代码解读】首先定义搜索框imput和确定按钮submit,通过分页那张图片我们可以定位到这两个位置,可通过开发者选项,在浏览器“搜索框”处右键“检查”,查看element选项卡,查找元素位置,后面的元素定位均用此方法。然后搜索框清空,再输入page,模拟点击按钮进行搜索。
点击之后,判断当前页面是否大于1,即text_to_be_present_in_elements,判断方法为页码高亮处的数字与输入的跳转页面比较。之后等待商品信息加载出来,即presence_of_element_located。最后利用get_products()方法解析商品数据。
from pyquery import PyQuery as pq
def get_products(): #提取商品数据
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(), #付款人数
'title':item.find('.title').text(), #商品标题
'shop':item.find('.shop').text(), #店铺名称
'location':item.find('.location').text() #地址
}
print(product)
#save_to_mongo(product)
最后,遍历每页,调用main()方法即可,代码如下:
def main():
for i in range(1,3):
index_page(i)
browser.close()
if __name__ == '__main__':
main()
pycharm数据运行如下:
MongoDB运行截图如下:
注:MongoDB数据库相关代码在本文中已被注释
本节代码已上传至github:https://github.com/lizeyang18/Pythpn3WebSpiser-taobao
学习永无止境,感谢阅读~