免责声明:本文所记录的技术手段及实现过程,仅作为爬虫技术学习使用,不对任何人完全或部分地依据本文的全部或部分内容从事的任何事情和因其任何作为或不作为造成的后果承担任何责任。
爬取需求:爬取淘宝网根据关键字搜索商品,商品的名称、价格、月销量信息;
爬取工具:chrome浏览器、pycharm
Python库:selenium
01
网站结构分析
打开淘宝首页,输入“手机”进行搜索:
点击相关商品详情页,所有信息均可以在详情页找到。
02
创建Selenium爬虫
打开Pycharm开发工具,新建selenium_tao.py,编写如下代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options();
# 去掉自动化控制提示信息
options.add_experimental_option("excludeSwitches", ['enable-automation']);
browser = webdriver.Chrome('C:\chromedriver.exe', options = options)
taobao_url = 'https://s.taobao.com/search?q=%E6%89%8B%E6%9C%BA'
def start_page(page):
browser.get(taobao_url)
browser.maximize_window()
start_page(1)
运行代码,发现网站需要登录,且登录拖动验证码报错:error:riWCd,增加以下代码,去掉自动控制的属性,完美解决:
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
03
爬取商品详情页
通过分析商品搜索页面,页面的清单全部展示,以及分页按钮全部展示,就可以满足本次爬取需求:
# 列表清单加载完成
wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, '.m-itemlist .items .item')
)
)
# 滚动条拖到底部
browser.execute_script('window.scrollTo(0, document.body.scrollHeight);')
# 分页加载完成
wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, '.wraper .items .item')
)
)
增加代码,爬取并记录所有页面详情信息:
def get_detail_url():
html = browser.page_source
dom = PyQuery(html)
items = dom('.m-itemlist .items .item').items()
detail_urls = []
for item in items:
detail_urls.append('http:' + item.find('.title a').attr('href'))
print(detail_urls)
return detail_urls
04
翻页处理
爬取完当前页的所有商品详情页面url,需要进行翻页处理,找到页面下一页的超链接,直接使用代码点击
browser.find_element_by_css_selector('.wraper .items .item.next > a').click()
运行代码,发现翻页报错,改为如下方式进行点击:
element = browser.find_element_by_css_selector('.wraper .items .item.next > a')
browser.execute_script("arguments[0].click();", element)
运行代码,跳转成功!
05
商品详情页处理
分析详情页html,爬取详情页的关键信息:
# 爬取详情页面信息
def get_detail_info(html_source):
dom = PyQuery(html_source)
detail_dom = dom('#J_DetailMeta')
detail_info = {
'name': detail_dom.find('.tb-detail-hd').find('a').text(),
'price': detail_dom.find('.tm-fcs-panel').find('.tm-price-panel.tm-price-cur').find('.tm-price').text(),
'sale_number': detail_dom.find('.tm-ind-panel').find('.tm-ind-item.tm-ind-sellCount').find('.tm-indcon').find('.tm-count').text()
}
return detail_info
将先前爬取的所有详情url依次打开,去解析详情页的相关信息:
def start_detail_page(detail_url_list):
detail_info_list = []
for detail_url in detail_url_list:
browser.get(detail_url)
# 设置最大等待时间
wait = WebDriverWait(browser, 30)
wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, '#J_DetailMeta .tb-detail-hd')
)
)
detail_info_list.append(get_detail_info(browser.page_source))
print(detail_info_list)
所有示例代码均可通过微信公众号回复关键字【pachong23】下载!