欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Selenium爬取淘宝商品概要入mongodb

程序员文章站 2022-05-25 20:17:04
准备: 1.安装Selenium:终端输入 pip install selenium 2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\;如果是Mac,可放入/usr/locl/bin,并将此目录放入环境变量 3.安装pyquery:终端输入 p ......

准备:

1.安装selenium:终端输入 pip install selenium

2.安装下载chromedriver:解压后放在…\google\chrome\application\;如果是mac,可放入/usr/locl/bin,并将此目录放入环境变量

3.安装pyquery:终端输入 pip install pyquery

4.安装pymongo:终端输入 pip install pymongo

5.安装mongodb的pycharm插件:preferences——plugins——mongo plugin,安装完成后重启pycharm可发现右侧有mongo explorer

6.安装mongodb,windows:参考小歪老师知乎专栏mongodb及可视化工具的安装;mac:参考 mac osx 平台安装 mongodb安装

注:有时pip安装后,pycharm中无法识别,首先确认编译器地址是否正确preferences---project interpreter;如果还不行,可在pycharm下preferences---project interpreter重新添加包

基于:python3.6

遇到的坑:

1.定位搜索框元素的时候,查找对象路径,在点完搜索按钮后的页面得到(正确应该在淘宝首页获取),结果运行的时候,怎么都获取不到这个对象;所以:获取元素的时候,一定要在正确的页面查找该元素位置

2.翻页,10页以前的页码链接定位中规中矩,10页以后分奇偶,奇数用#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a定位;偶数用#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a定位,具体见源码

以下是源码,参考了很多dc 学院《python爬虫(入门+进阶)》1-7,1-8课程内容,这算不算硬广:p 

#!/usr/bin/python
# -*- coding:utf-8 -*-

from selenium import webdriver
from selenium.webdriver.support.wait import webdriverwait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import by
from pyquery import pyquery as pq
import re
import time
from pymongo import mongoclient as mc

driver = webdriver.chrome() #打开chrome浏览器
wait = webdriverwait(driver, 10)

# 获取总页数
def search():
try:
driver.get('https://www.taobao.com')
# 获取搜索关键字输入框
input = wait.until(ec.presence_of_element_located((by.css_selector, '#q')))
# 获取搜索按钮
search = wait.until(ec.element_to_be_clickable((by.css_selector, '#j_tsearchform > div.search-button > button')),'not find element')
# 输入关键字
input.send_keys(u'鞋子')
# 点搜索
search.click()
# 获取总页数
page_total = wait.until(ec.presence_of_element_located((by.css_selector, '#mainsrp-pager > div > div > div > div.total')),'not find element')
# 调用方法获取首页产品概要
get_products()
return page_total.text
except exception as ex:
print(ex)

# 翻页
def page(pagenum):
try:
# 页数小于10,直接按页数定位
if(pagenum < 10):
css = '#mainsrp-pager > div > div > div > ul > li:nth-child({}) > a'.format(pagenum)
else:
# 页数大于10,如果是偶数,按nth-child(9)定位
if (pagenum%2==0):
css = '#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a'
# 页数大于10,如果是奇数,按nth-child(8)定位
else:
css = '#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a'

# 获取页码链接
link = wait.until(ec.element_to_be_clickable((by.css_selector, css)), 'not find element')
# 点击页码链接
link.click()
time.sleep(1)
# 调用方法获取产品概要
get_products()
except exception as ex:
print(ex)

# 获取每页产品概要数据
def get_products():
# 所有产品项位置
pb = wait.until(ec.presence_of_element_located((by.css_selector, '#mainsrp-itemlist .items .item')),
' not find element')
html = driver.page_source
doc = pq(html)
# 获取所有产品项数据
items = doc('#mainsrp-itemlist .items .item').items()
# 轮询每个产品
for item in items:
product = {
# 产品图片链接
'image': item.find('.pic .img').attr('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['title'])
# 入mongodb库
client =mc()
db = client.taobao
set = db.xiezi
set.insert(product)


if __name__ == '__main__':
# 获取总页数
page_total = search()
# 获取int 总页数
pagenum = int(re.compile('(\d+)').search(page_total).group(1))
# 轮询页码,获取产品概要;测试需要,只取15页
for i in range(3, 15):
print(str(i)+':')
page(i)
driver.quit()