# 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. 002/CDN-内容分发网络

    CDN-内容分发网络 来自于今日头条: https://www.toutiao.com/a6531234862563590663/?tt_from=weixin&utm_campaign=cl ...

  2. ES6新增特性

    ES6:  ECMA 第六次改版   块级作用域:   凡是被{ }包裹住的代码都是块级作用域,除了对象       特点:会造成一个暂时性死区    新增声明变量的两种方式: let:     a. ...

  3. 20190905 Lombok常用注解

    Lombok常用注解 val 用于声明类型,将从初始化表达式推断出类型,仅适用于局部变量和foreach循环,而不适用于字段.声明的局部变量为final变量. Java自带类型推断随着JDK版本提升越 ...

  4. java程序利用ansible修改redis服务参数

    第一步,java调用shell paraname和paravalue是传给playbook的变量. try { String cmd5 = "sudo ansible-playbook /s ...

  5. python基础-3 集合 三元运算 深浅拷贝 函数 Python作用域

    上节课总结 1 运算符 in 字符串 判断  : “hello” in "asdasfhelloasdfsadf" 列表元素判断:"li" in ['li', ...

  6. [Vim 填坑] 01 Vim 中替换与注释的补充

    目录 1. print( 坑的信息 ) 2. 开始填坑 (1) :n1,n2s/old/new/gc 的后续命令 ^E ^Y (2) 利用"V-可视"模式进行多行注释 1. pri ...

  7. Vue源码详细解析:transclude,compile,link,依赖,批处理...一网打尽,全解析!

    用了Vue很久了,最近决定系统性的看看Vue的源码,相信看源码的同学不在少数,但是看的时候却发现挺有难度,Vue虽然足够精简,但是怎么说现在也有10k行的代码量了,深入进去逐行查看的时候感觉内容庞杂并 ...

  8. 本地局域网MySQL数据库连接方法(Navcat权限设置)

    情景: 当同一局域网环境中,需要协同开发并涉及到本地数据库互联情况,有关权限需要开放! 设置流程: 1.受访端连接 打开Navcat>>>>点击本地数据库>>> ...

  9. postman断言

    较旧的写作邮差测试风格 较旧的Postman测试编写风格依赖于特殊tests对象的设置值.您可以为对象中的元素设置描述性键,然后说明它是真还是假.例如,tests["Body contain ...

  10. centos7.4安装mysql

    yum -y install mysql mysql-server mysql-devel mysql-server报错:No package mysql-server available,另外两个没 ...