淘宝商品页爬取
程序员文章站
2022-04-26 15:41:09
...
之前的脚本很基础,都是针对于静态网页的爬取。
本文将以淘宝为例,运用selenium+chrome(headless)模拟浏览器,解决JS渲染问题,爬取商品信息并存储至MongoDB库中。(最新版selenium中已无法使用phatomjs,所以使用chrome的无头模式替代之。)
IDE推荐使用Pycharm,安装教程Pycharm;
安装MongoDB,安装教程MongDB 。
安装ROBOMongo。
使用模块:selenium、chromedriver、re、pyquery、pymongo
思路:模拟浏览器操作,抓取渲染后的网页数据,并存储至数据库中。
关于selenium的教程网上很多,帮助文档http://selenium-python.readthedocs.io/
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
import pymongo
#MongoDB配置
client = pymongo.MongoClient()
db = client['TAOBAO']
TAOBAO = db['JIXIANG']
#selenium配置
opt = webdriver.ChromeOptions()
opt.set_headless()
browser = webdriver.Chrome(options = opt)
url = 'https://www.taobao.com/'
wait = WebDriverWait(browser, 10)
#获得商品搜索页第一页
def search_item(kyword):
browser.get(url)
#搜索输入框并等待加载成功
search_input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
#搜索按钮并等待可成功点击
search_submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
)
#传入搜索关键词
search_input.send_keys(kyword)
#点击搜索按钮
search_submit.click()
#返回总页数
totalpage = browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]')
#解析器
paraser()
return totalpage.text
#翻页
def next_page(num):
#翻页输入框并等待加载成功
nextpage_input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
)
#翻页按钮并等待加载成功
nextpage_submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
)
#解析器
paraser()
#清空输入内容
nextpage_input.clear()
#传入翻页页数
nextpage_input.send_keys(num)
#点击翻页按钮
nextpage_submit.click()
#确认当前页数为输入翻页页数
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span"
), str(num))
)
#解析器
def paraser():
#商品页内容加载完毕
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
html = browser.page_source
#使用PyQuery清洗内容
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().replace('\n',''),
'deal':item.find('.deal-cnt').text()[:-3],
'title':item.find('.title').text().replace('\n',''),
'shop':item.find('.location').text()
}
print(product)
# 保存器
saver(product)
# 保存器
def saver(result):
# 保存至MongoDB数据库
if TAOBAO.insert(result):
print('SUCCESS', result)
def main():
input('输入商品名称:')
totalpage = search_item()
totalpage = int(re.compile('(\d+)').search(totalpage).group(1))
for i in range(2,totalpage):
next_page(i)
if __name__ == '__main__':
main()
上一篇: selinux管理
下一篇: selinux内核级防火墙的初级管理