Python selenium自动化网页抓取器

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

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

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

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

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

三、关于mongodb的自动id的生成。mongodb中全部的存储数据都是有固定的id的,可是mongodb的id对于人类来说是复杂的,对于机器来说是小菜一碟的,因此在存入数据的同时,我习惯用新id来对每一条数据的负责!数据库

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

 

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

引入模块:工具

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都是以前就有提过的,他们都是核心缺一不可!oop

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

先说一下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()

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

 

相关文章
相关标签/搜索