# 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. boost的libboost_system问题

    最近把cpp代码从开发机放到eclipse时,遇到了不少路径问题. 安装boost的时候,其实很简单 wget http://sourceforge.net/projects/boost/files/ ...

  2. 如何理解ajax的同步和异步?

    对于如下一段代码: var dataJson = {"ABC":'testABC'}; $.ajax({                url: "/MonkeyServ ...

  3. js Object的属性 Configurable,Enumerable,Writable,Value,Getter,Setter

    对象的数据属性 Configurable,Enumerable,Writable,Value var person = {} Object.defineProperty(person,'name',{ ...

  4. LeetCode102. 二叉树的层次遍历

    102. 二叉树的层次遍历 描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 示例 例如,给定二叉树: [3,9,20,null,null,15,7], 3 / ...

  5. Vue学习之旅:todomvc的学习练习

    一.前奏 1.todomvc官网地址:http://todomvc.com/ 查阅文档和下载插件都可以到这个官网上找. 2.上GitHub上搜索下载有人做的现成的本地模板:进入GitHub搜索todo ...

  6. 通过利用immutability的能力编写更安全和更整洁的代码

    通过利用immutability的能力编写更安全和更整洁的代码 原文:Write safer and cleaner code by leveraging the power of "Imm ...

  7. 一、bootstrap-upload

    一.bootstrap-upload 前端代码: @{ Layout = null; } <!DOCTYPE html> <html lang="zh-CN"&g ...

  8. 【学习】010 Netty异步通信框架

    Netty快速入门 什么是Netty Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性. Netty应用场景 1.分 ...

  9. idea hibernate console 执行hql报错

    报错信息 hql> select a from GDXMZD a[2019-08-29 13:45:01] org.hibernate.service.spi.ServiceException: ...

  10. spring mvc和spring boot的区别

    spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...