selenuim&PhantomJS&Beautifulsoup练习经典实例
# 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练习经典实例的更多相关文章
- 《C#并发编程经典实例》笔记
1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- 数据可视化(5)--jqplot经典实例
本来想把实例也写到上篇博客里,最后发现太长了,拆成两篇博客了. 实例来源于官方文档:http://www.jqplot.com/tests/ 这篇博客主要是翻译了官方文档关于经典实例的解说,并在相应代 ...
- 《C# 并发编程 · 经典实例》读书笔记
前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...
- Sql Server专题:SQL 经典实例
SQL 经典实例 1.实例表: Student(S#,Sname,Sage,Ssex) 学生表 S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname ...
- 多线程中lock用法的经典实例
多线程中lock用法的经典实例 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...
- 【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例
#用法说明 select row_number() over(partition by A order by B ) as rowIndex from table A :为分组字段 B:为分组后的排序 ...
- 《C#并发编程经典实例》学习笔记—2.3 报告任务
问题 异步操作时,需要展示该操作的进度 解决方案 IProgress<T> Interface和Progress<T> Class 插一段话:读<C#并发编程经典实例&g ...
- [书籍]用UWP复习《C#并发编程经典实例》
1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...
随机推荐
- windows10配置Docker容器独立IP地址互相通信
Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的
以下是在论坛中看到的两种解释: (1)如果是要你的代码在编译时发现编译器类型,就判断_cplusplus或_STDC_宏,通常许多编译器还有其他编译标志宏, #ifdef __cplusplus co ...
- sqlMap.xml配置文件中迭代一个集合的方式
比如:根据班级号查询学生的信息,参数是list 1.foreach的用法:[写法一] <select id="getStudentListByClassId" resultM ...
- jquery点击切换在点击切换
<div style=" position: absolute; top: 6rem; right: 4rem;" id="hides" > < ...
- 剑指Offer编程题(Java实现)——替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路1 在字符串尾部填充任 ...
- JavaScript ES6中export、import与export default的用法和区别
前言 相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在看他们之间的区别之前,我们先来看看它们的用法. ES6 import和export的用法 ...
- docker网络 macvlan
docker 还开发了另一个支持跨主机容器网络的 driver:macvlan. macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 ...
- 使用 js 修饰器封装 axios
修饰器 修饰器是一个 JavaScript 函数(建议是纯函数),它用于修改类属性/方法或类本身.修饰器提案正处于第二阶段,我们可以使用 babel-plugin-transform-decorato ...
- echarts柱状图个数多,横坐标名称过长显示不全解决方法
当echarts柱状图个数多,横坐标名称过长时横坐标名称显示不全,网上并没有搜到太好的方法,于是自己加工了下,将横坐标名称显示前六位,当鼠标放到上面的时候显示全名,下面是示例代码,可以直接拷贝测试 代 ...
- C++11常用特性总结
非原创,转载出处 http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于 ...