zoukankan      html  css  js  c++  java
  • Python selenium自动化网页抓取器

    (开开心心每一天~ ---虫瘾师)

    直接入正题---Python selenium自动控制浏览器对网页的数据进行抓取,其中包含按钮点击、跳转页面、搜索框的输入、页面的价值数据存储、mongodb自动id标识等等等。

    1、首先介绍一下 Python selenium ---自动化测试工具,用来控制浏览器来对网页的操作,在爬虫中与BeautifulSoup结合那就是天衣无缝,除去国外的一些变态的验证网页,对于图片验证码我有自己写的破解图片验证码的源代码,成功率在85%。

         详情请咨询QQ群--607021567(这不算广告,群里有好多Python的资源分享,还有大数据的一些知识【hadoop】)

    2、beautifulsoup就不需要详细的介绍了,直接上网址-https://www.crummy.com/software/BeautifulSoup/bs4/doc/(BeautifulSoup的官方文档)

    3、关于mongodb的自动id的生成。mongodb中所有的存储数据都是有固定的id的,但是mongodb的id对于人类来讲是复杂的,对于机器来讲是小菜一碟的,所以在存入数据的同时,我习惯用新id来对每一条数据的负责!

    在Python中使用mongodb的话需要引进模块 from pymongo import MongoClient,ASCENDING, DESCENDING ,该模块就是你的责任!

     

    接下来开始讲程序,直接上实例(一步一步来):

    引入模块:

    1 from selenium import webdriver
    2 from bs4 import BeautifulSoup
    3 import requests
    4 from pymongo import MongoClient,ASCENDING, DESCENDING
    5 import time
    6 import re

    其中的每一个模块都会说已经解释过了,其中的re、requests都是之前就有提过的,他们都是核心缺一不可!

    首先,我举一个小例子,淘宝的自动模拟搜索功能(源码):

    先说一下selenium 的定位方法

    • find_element_by_id
    • find_element_by_name
    • find_element_by_xpath
    • find_element_by_link_text
    • find_element_by_partial_link_text
    • find_element_by_tag_name
    • find_element_by_class_name
    • find_element_by_css_selector

    源码:

     1 from selenium import webdriver
     2 from bs4 import BeautifulSoup
     3 import requests
     4 from pymongo import MongoClient,ASCENDING, DESCENDING
     5 import time
     6 import re
     7 
     8 def TaoBao():
     9     try:
    10         Taobaourl = 'https://www.taobao.com/'
    11         driver = webdriver.Chrome()
    12         driver.get(Taobaourl)
    13         time.sleep(5)#通常这里需要停顿,不然你的程序很有可能被检测到是Spider
    14         text='Strong Man'#输入的内容
    15         driver.find_element_by_xpath('//input[@class="search-combobox-input"]').send_keys(text).click()
    16         driver.find_element_by_xpath('//button[@class="btn-search tb-bg"]').click()
    17         driver.quit()
    18         
    19     except Exception,e:
    20         print e
    21 
    22 if __name__ == '__main__':
    23     TaoBao()

    效果的实现,你们可以直接复制后直接运行!我只用了xpath的这个方法,因为它最实在!橙色字体(如果我没有色盲的话),就是网页中定位的元素,可以找到的!

    接下来就是与BeautifulSoup的结合了,但是我们看到的只是打开了网页,并没有源码,那么就需要 “变量名.page_source”这个方法,他会实现你的梦想,你懂得?

    1 ht =  driver.page_source
    2 #print ht 你可以Print出啦看看
    3 soup = BeautifulSoup(ht,'html.parser')

    下面就是BeautifulSoup的一些语法操作了,对于数据的结构还有采集,在上一篇里面有详细的抓取操作!!!

    算了!说一个最简单的定位抓取:

    1 soup = BeautifulSoup(ht,'html.parser')
    2 a = soup.find('table',id="ctl00_ContentMain_SearchResultsGrid_grid")
    3 if a:  #必须加判断,不然访问的网页或许没有这一元素,程序就会都停止!

    class的标签必须是class_,一定要记住!

    哈哈哈!mongodb了昂,细节细节,首先需要用到模块----from pymongo import MongoClient,ASCENDING, DESCENDING

    因为在python,mongodb的语法仍然实用,所以需要定义一个库,并且是全局性的,还有链接你计算机的一个全局变量。

    1 if __name__ == '__main__':  
    2 
    3   global db#全局变量                   
    4   global table#全局数据库
    5   table = 'mouser_product'
    6   mconn=MongoClient("mongodb://localhost")#地址
    7   db=mconn.test
    8   db.authenticate('test','test')#用户名和密码
    9   Taobao()

    定义这些后,需要我们的新id来对数据的跟踪加定义:

    1 db.sn.find_and_modify({"_id": table}, update={ "$inc": {'currentIdValue': 1}},upsert=True)
    2 dic = db.ids.find({"_id":table}).limit(1)
    3 return dic[0].get("currentIdValue") 

    这个方法是通用的,所以只要记住其中的mongodb的语法就可以了!因为这里是有返回值的,所以这个是个方法体,这里不需要太过于纠结是怎么实现的,理解就好,中心还是在存数据的过程中

    1 count = db[table].find({'数据':数据}).count() #是检索数据库中的数据
    2 if count <= 0:                               #判断是否有
    3     ids= getNewsn()                          #ids就是我们新定义的id,这里的id是1开始的增长型id
    4     db[table].insert({"ids":ids,"数据":数据})            

    这样我们的数据就直接存入到mongodb的数据库中了,这里解释一下为什么在大数据中这么喜欢mongodb,因为它小巧,速度佳!

    最后来一个实例源码:

     1 from selenium import webdriver
     2 from bs4 import BeautifulSoup
     3 import requests
     4 from pymongo import MongoClient,ASCENDING, DESCENDING
     5 import time
     6 import re
     7 def parser():
     8     try:
     9         f = open('sitemap.txt','r')
    10         for i in  f.readlines():
    11             sorturl=i.strip()
    12             driver = webdriver.Firefox()
    13             driver.get(sorturl)
    14             time.sleep(50)
    15             ht =  driver.page_source
    16             #pageurl(ht)
    17             soup = BeautifulSoup(ht,'html.parser')
    18             a = soup.find('a',class_="first-last")
    19             if a:
    20                 pagenum = int(a.get_text().strip())
    21                 print pagenum
    22                 for i in xrange(1,pagenum):
    23                     element = driver.find_element_by_xpath('//a[@id="ctl00_ContentMain_PagerTop_%s"]' %i)
    24                     element.click()
    25                     html =  element.page_source
    26                     pageurl(html)
    27                     time.sleep(50)
    28                     driver.quit()
    29     except Exception,e:
    30         print e
    31 def pageurl(ht):
    32     try:
    33         soup = BeautifulSoup(ht,'html.parser')
    34         a = soup.find('table',id="ctl00_ContentMain_SearchResultsGrid_grid")
    35         if a:
    36             tr = a.find_all('tr',class_="SearchResultsRowOdd")
    37             if tr:
    38                     for i in tr:
    39                         td = i.find_all('td')
    40                         if td:
    41                             url = td[2].find('a')
    42                             if url:
    43                                 producturl = '网址'+url['href']
    44                                 print producturl
    45                                 count = db[table].find({"url":producturl}).count()
    46                                 if count<=0:
    47                                     sn = getNewsn()
    48                                     db[table].insert({"sn":sn,"url":producturl})
    49                                     print str(sn) + ' inserted successfully'
    50                                     time.sleep(3)
    51                                 else:
    52                                     print 'exists url'
    53             tr1 = a.find_all('tr',class_="SearchResultsRowEven")
    54             if tr1:
    55                     for i in tr1:
    56                         td = i.find_all('td')
    57                         if td:
    58                             url = td[2].find('a')
    59                             if url:
    60                                 producturl = '网址'+url['href']
    61                                 print producturl
    62                                 count = db[table].find({"url":producturl}).count()
    63                                 if count<=0:
    64                                     sn = getNewsn()
    65                                     db[table].insert({"sn":sn,"url":producturl})
    66                                     print str(sn) + ' inserted successfully'
    67                                     time.sleep(3)
    68                                 else:
    69                                     print 'exists url'
    70                                 #time.sleep(5)
    71 
    72     except Exception,e:
    73         print e
    74 def getNewsn(): 
    75     db.sn.find_and_modify({"_id": table}, update={ "$inc"{'currentIdValue': 1}},upsert=True)
    76     dic = db.sn.find({"_id":table}).limit(1)
    77     return dic[0].get("currentIdValue")
    78 
    79 if __name__ == '__main__':  
    80 
    81   global db                    
    82   global table
    83   table = 'mous_product'
    84   mconn=MongoClient("mongodb://localhost")
    85   db=mconn.test
    86   db.authenticate('test','test')
    87   parser()

    这一串代码是破解一个老外的无聊验证码界面结缘的,我真的对他很无语了!破解方法还是实践中!这是完整的源码,无删改的哦!纯手工!

  • 相关阅读:
    将Microsoft SQL Server 2000数据库转换成MySQL数据库
    centos7 升级php版本
    Jquery Ajax方法传递json到action
    2015/12/7
    sql server 2008 评估期已过期
    C# 邮件发送注意事项
    ReSharper warning: Virtual member call in a constructor
    EF code first 生成edmx文件
    EF 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
    C# 发送邮件
  • 原文地址:https://www.cnblogs.com/zhuPython/p/8317784.html
Copyright © 2011-2022 走看看