# coding = utf-8
__autor__ = 'litao' 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, time, random
import selenium.common.exceptions
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from bs4 import BeautifulSoup
from selenium.webdriver.common.action_chains import ActionChains
from pymongo import MongoClient dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.103 Safari/537.36"
) # 修改刘浏览器请求头的useragent属性
SERVICE_ARGS = ['--load-images=false', '--disk-cache=true'] # 设置浏览器为无图和磁盘缓存模式
brower = webdriver.PhantomJS(service_args=SERVICE_ARGS, desired_capabilities=dcap)
brower.set_window_size(1920, 1080) # 设定对应的分辨率,防止在执行点击操作时浏览器找不到对应的元素
wait = WebDriverWait(brower, 10) # 设定最大等待时间
brower.get(url="https://www.taobao.com") def search(retry_times):
# wait = WebDriverWait(brower, 10) #设定最大等待时间
# brower.get(url="https://www.taobao.com")
try:
input_content = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
search_botton = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".btn-search")))
input_content.send_keys("美食")
search_botton.click()
totle = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".total")))
print("0k")
print("1")
pase_page(1)
return totle.text
except selenium.common.exceptions.TimeoutException as e:
print(e)
if retry_times > 0:
retry_times -= 1
return search(retry_times) # 用于等待超时重新爬取
return None def next_page(page_number, retry_times):
try:
input_content = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")))
search_botton = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))
input_content.clear()
input_content.send_keys(page_number)
search_botton.click()
wait.until(EC.text_to_be_present_in_element(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)))
print(str(page_number))
pase_page(page_number)
except selenium.common.exceptions.TimeoutException as e:
print(e)
if retry_times > 0:
retry_times -= 1
return next_page(page_number, retry_times) # 用于等待超时重新爬取 def pase_page(page_number):
if page_number == 1:
list2 = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, "#J_itemlistPersonality > div:nth-child(1) > div:nth-child(1)")))
ActionChains(brower).move_to_element(list2).perform()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#J_itemlistCont")))
html = brower.page_source
# print(html+"\n"+"\n"+"\n"+"\n")
html = html.replace("item J_MouserOnverReq ", "item_J_MouserOnverReq")
soup = BeautifulSoup(html, 'html.parser')
content = soup.find_all('div', attrs={"class": "item_J_MouserOnverReq"})
print(len(content))
for item in content:
result = {
"image": item.find('img').get('data-src'),
"price": item.find(class_="price").text.strip(),
"deal": item.find(class_="deal-cnt").text.strip()[:-3],
"title": re.sub('\s', '', item.find(class_="title").text.strip()),
"shop": re.sub('\s', '', item.find(class_="shop").text.strip()),
"location": re.sub('\s', '', item.find(class_="location").text.strip())
}
print(result)
save_to_mongodb(result)
print("**********************************************************************************************") def save_to_mongodb(product):
client = MongoClient('127.0.0.1', 27017)
db = client.taobao
db["taobao_meishi"].insert(product) def main():
try:
result = search(2)
if result:
count_page = int(re.search('.*?(\d+).*', result).group(1))
for i in range(2, count_page + 1):
time.sleep(random.randint(1, 3))
print("-----", i)
next_page(i, 2) except Exception as e:
print("程序运行过程中出现错误,具体错误如下所示:" + '\n', e)
finally:
brower.close() # 此处运用try-except-finally结构用于无论个何种因素引起的异常都会在程序退出之前将程序浏览器关闭 if __name__ == "__main__":
main()

selenuim&PhantomJS&Beautifulsoup练习经典实例的更多相关文章

  1. 《C#并发编程经典实例》笔记

    1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...

  2. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  3. 数据可视化(5)--jqplot经典实例

    本来想把实例也写到上篇博客里,最后发现太长了,拆成两篇博客了. 实例来源于官方文档:http://www.jqplot.com/tests/ 这篇博客主要是翻译了官方文档关于经典实例的解说,并在相应代 ...

  4. 《C# 并发编程 · 经典实例》读书笔记

    前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...

  5. Sql Server专题:SQL 经典实例

    SQL 经典实例 1.实例表: Student(S#,Sname,Sage,Ssex) 学生表 S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname ...

  6. 多线程中lock用法的经典实例

    多线程中lock用法的经典实例 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...

  7. 【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例

    #用法说明 select row_number() over(partition by A order by B ) as rowIndex from table A :为分组字段 B:为分组后的排序 ...

  8. 《C#并发编程经典实例》学习笔记—2.3 报告任务

    问题 异步操作时,需要展示该操作的进度 解决方案 IProgress<T> Interface和Progress<T> Class 插一段话:读<C#并发编程经典实例&g ...

  9. [书籍]用UWP复习《C#并发编程经典实例》

    1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...

随机推荐

  1. pandas 入门(2)

    from pandas import Series, DataFrame, Index import numpy as np from numpy import nan as NA obj = Ser ...

  2. TypeScript + Webpack 环境搭建

    TypeScript + Webpack 环境搭建步骤 安装Node.js 安装npm 创建一个npm项目 安装typescript,配置ts 安装webpack,配置webpack 初始化一个npm ...

  3. oracle--批量删除部分表,将某一列拼接成字符串

    1.查询要批量删除的表 SELECT * FROM USER_TABLES SELECT 'DROP '||'TABLE ' || TABLE_NAME ||' ;' ,1 FROM USER_TAB ...

  4. JVM可视化监控工具jconsole以及jvisualvm的配置

    使用jdk自带的jconsole.jvisualvm插件,监控远程linux服务器中tomcat的jvm情况 (jconsole.jvisualvm插件可查看堆内存变化情况,线程状态,CPU使用情况, ...

  5. [C] Re-execute itself from elf file.

    Re-execute itself from elf file. #define _GNU_SOURCE #include <sched.h> #include <stdio.h&g ...

  6. appscan 9.0.3.12 版本下载--补丁验证---win10 验证OK

    链接:扫描下面二维码

  7. C# System.Web.Caching.Cache类 缓存 各种缓存依赖

    原文:https://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntim ...

  8. k3 cloud工程量清单调整后工程量为零行设置为黄色

    #引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee ...

  9. css炫酷动画收藏

    1.按钮.hover.input动画(cssfx) https://cssfx.dev/ 2.svg 矢量定制icon(ikonate) https://www.ikonate.com/#conten ...

  10. kali优化配置(2)

    下次再安Java吧...心累小赵在线哭泣... 0x01 安装显卡驱动 安装GPU,加速密码破解: grub--kali的启动器 0x02 并发线程限制 ulimit由于限制当前shell内进程的资源 ...