zoukankan      html  css  js  c++  java
  • Python数据挖掘(爬虫强化)

    (我喜欢雨天,因为雨天我可以回到童年踩水花!哈!)

    2018年 --7月--12日 : 多云又暴雨 T—T

    前言

    我要把爬虫的终极利器介绍一下,这个只要是我们肉眼能看到的,就算在源码中或者在json中,或是post也无法得到的数据,我们都可以获取到,雷同F12后源码暴露在你面前一样!

    这次需要用到selenium家族的一些成员,它们各司其职,各个身怀绝技

    先介绍一下selenium模块:Selenium is a suite of tools specifically for automating web browsers.(Selenium是一套专门用于自动化web浏览器的工具。)

    ---:(这里补充一下,在需要用到这种大型模块的时候,一定要去读官方文档,不要去听百度里面和一些断章取义的人瞎写的内容,他们更容易把你带偏。)

    这个Selenium模块主要是应对我们自动浏览网页数据所需要用的,让程序来执行半智能,前提你要教会它去做什么事情!

    直接介绍此次所需要用到的家族模块:

    1 from selenium import webdriver
    2 import time
    3 from selenium.webdriver.common.keys import Keys
    4 from selenium.webdriver.common.action_chains import ActionChains
    5 from selenium.webdriver.common.by import By

    一、每一个解释一下哈,按顺序对号:

    1、主模块的嵌入,主要是应对控制程序自动打开浏览器浏览网页功能。

    2、作为开发人员,尤其是对网页自动化测试的开发工具必须需要time模块来制约程序的访问时间,因为可能网站会直接把你IP封掉。

    3、selenium 模块家族成员Keys,此成员是应当以模拟键盘操作,应对模拟输入用户登录名和密码,或者价值数据索引输入。

    4、selenium 模块家族成员ActionChains,它则是应对模拟鼠标操作,对与鼠标的双击,单击,左右键,应对我们翻页,搜索按钮的点击功能。

    5、selenium 模块家族成员By,这个则是我们要教会它所要做的事情,也是我们数据挖掘又要用到的核心价值功能之一,应对价值数据抓取。

    二、开发初步:

    1、操作程序打开浏览器并打开我们需要进入的网页:

    1 url = 'https://www.xxx.com'
    2 driver=webdriver.Chrome()
    3 driver.get(url)
    4 time.sleep(5)
    5 driver.quit()

    这里可以自己测试一下,我所使用的是Google的浏览器,你们可以尝试使用Firefox,他们有一些的区别,主要是站点的区别!

    2、进入页面后锁定tag

    html:

    1 <div id="aaa" class="bbb" name="ccc">
    2     <p></p>
    3     <p><a></p>
    4 </div>

    python:

     1 element = driver.find_element_by_id("aaa")
     2 frame = driver.find_element_by_tag_name("div")
     3 cheese = driver.find_element_by_name("ccc")
     4 cheeses = driver.find_elements_by_class_name("bbb")
     5 
     6 or
     7 
     8 from selenium.webdriver.common.by import By
     9 element = driver.find_element(by=By.ID, value="aaa")
    10 frame = driver.find_element(By.TAG_NAME, "div")
    11 cheese = driver.find_element(By.NAME, "ccc")
    12 cheeses = driver.find_elements(By.CLASS_NAME, "bbb")

    这里每一个都是锁定tag树,它们都是根据id,class,name,tagname来定义的。

    1 xpath_class = driver.find_element_by_xpath('//div[@class="bbb"]/p')
    2 xpath_id = driver.find_element_by_xpath('//div[@id="aaa"]/p')

    这是通用方法的,Xpath方法,它们都输属于解析网页的内容锁定tag。

    3、处理操作:

    当我们锁定功能键的tag属性的时候,我们就可以进一步操作,比如换页,搜索功能的实现,对于模拟键盘输入的可以参考我的另一篇博客,《python自动化爬虫》

    这里我们就介绍一下模拟鼠标的操作:

    1 elem = driver.find_element_by_xpath('//a[@id="tagname"]')
    2 ActionChains(driver).double_click(elem).perform()
    3 time.sleep(3)

    因为时间问题,我只是介绍一下鼠标左键单击换页操作,其他的何以参考一下官方文档:Selenium Webdrive

    ActionChains:锁定浏览器,double_click锁定tag标签树,.perform():点击标签树

    4、获取价值数据

    这里的操作类似与Xpath的语法:

    driver.find_elements_by_tag_name('td')[3].text
    driver.find_elements_by_tag_name('a').get_attribute('href')

    这里注意一下elements,指所有的tag-> a比标签的href,这里是list格式,需要遍历。

    5、最后来一串完整代码:

     1 from selenium import webdriver
     2 import time
     3 import lxml.html as HTML
     4 from bs4 import BeautifulSoup
     5 from selenium.webdriver.common.keys import Keys
     6 from selenium.webdriver.common.action_chains import ActionChains
     7 from pymongo import MongoClient,ASCENDING, DESCENDING
     8 from selenium.webdriver.common.by import By
     9 def parser():
    10       url = 'https://www.xxx.com'
    11       driver=webdriver.Chrome()
    12       driver.get(url)
    13       time.sleep(5)
    14       for i in range(1,675):
    15             a = driver.find_element_by_xpath('//div[@class="aaa"]')
    16             tr =  a.find_elements_by_tag_name('tr')
    17             for j in xrange(1,len(tr)):
    18                   quantity = tr[j].find_elements_by_tag_name('td')[3].text
    19                   producturl = tr[j].find_elements_by_tag_name('td')[0].find_elements_by_tag_name("div")[1].find_element_by_tag_name('ul').find_element_by_tag_name('li').find_element_by_tag_name('a').get_attribute('href')
    20                   producturl_db(producturl,quantity)
    21             elem = driver.find_element_by_xpath('//a[@id="eleNextPage"]')
    22             ActionChains(driver).double_click(elem).perform()
    23             time.sleep(3)
    24       
    25       driver.quit()
    selenium有个小GUB,就是在用Xpath的时候,你已经找到父级tag,但是这个父级很多,比如tr,你如果遍历它,寻找td的话,那么你还是使用find_elements_by_tag_name,因为那个会初始化,不会管你找到那个父级。所以这里是需要注意的!
    最后祝你们加油!!!!!
  • 相关阅读:
    python登录csdn并自动评论下载资源脚本
    聊聊C语言的预编译指令include
    ANSI C、ISO C、Standard C联系与区别
    我对在开发板上开发程序的一些理解
    关于CMTS设备的一些备忘
    一个简单的EJB例子
    手动部署EJB于WebLogic
    eclipse+MyEclipse+WebLogic开发简单的EJB
    我对视频“分辨率”的理解以及在电视上显示的理解
    VC win32 static library静态链接库简单示例
  • 原文地址:https://www.cnblogs.com/zhuPython/p/9300879.html
Copyright © 2011-2022 走看看