Python selenium自动化网页抓取器

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: (开开心心每一天~ ---虫瘾师) 直接入正题---Python selenium自动控制浏览器对网页的数据进行抓取,其中包含按钮点击、跳转页面、搜索框的输入、页面的价值数据存储、mongodb自动id标识等等等。

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

直接入正题---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()

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

 

Welcome to Python world! I have a contract in this world! How about you?
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1天前
|
数据采集 JSON API
自动化Reddit图片收集:Python爬虫技巧
自动化Reddit图片收集:Python爬虫技巧
|
2天前
|
存储 数据管理 测试技术
构建Python构建自动化测试框架(原理与实践)
当谈到软件质量保证时,自动化测试是一个不可或缺的步骤。Python作为一种简单易学的编程语言,具有丰富的测试框架和库,使得构建自动化测试框架变得相对简单。本文将介绍如何使用Python构建自动化测试框架,包括选择合适的测试框架、编写测试用例、执行测试和生成报告等方面。
构建Python构建自动化测试框架(原理与实践)
|
2天前
|
Java 测试技术 Web App开发
《手把手教你》系列技巧篇(六十二)-java+ selenium自动化测试-RemoteWebDriver让你的代码与测试分离(远程测试)
【6月更文挑战第3天】本文介绍了在没有本地浏览器的情况下,如何使用RemoteWebDriver进行远程自动化测试。RemoteWebDriver分为客户端和服务端,客户端运行测试代码,服务端启动服务。服务端需要安装JDK、浏览器和对应的WebDriver,并启动selenium-server-standalone.jar。客户端通过URL连接到服务端,并指定预期的浏览器类型。这样,客户端的测试代码就能远程控制服务端的浏览器执行自动化测试。RemoteWebDriver的优点包括跨平台和浏览器测试、提高测试稳定性以及使测试环境和执行代码的机器分离。
20 3
|
3天前
|
测试技术 Python Java
《手把手教你》系列技巧篇(六十一)-java+ selenium自动化测试 - 截图三剑客 -下篇(详细教程)
【6月更文挑战第2天】本文介绍了使用Java + Selenium进行自动化测试时如何截图指定元素或目标区域。通过访问百度首页,点击设置并进入搜索设置页面,然后调用截图类截取并保存该页面的特定部分。代码示例展示了如何捕获元素的图像,并提供了截图功能的实现。最终,文章还展示了代码运行后的控制台输出、保存的截图以及浏览器的实际操作效果。
16 0
|
4天前
|
Web App开发 IDE 测试技术
使用Selenium进行自动化测试:从入门到实践
【6月更文挑战第1天】本文介绍了使用Selenium进行自动化测试的基础知识,包括Selenium工具集的三大组件:WebDriver、IDE和Grid。Selenium支持多种浏览器和编程语言接口。文中详细阐述了安装配置过程,如安装浏览器驱动和Selenium库,并提供了一个Python示例,演示如何初始化WebDriver、打开网页、操作元素及关闭浏览器。此外,文章指出Selenium可扩展实现更复杂测试,可与其他测试框架结合以提升测试效率。
|
4天前
|
JSON 程序员 数据格式
豆瓣评分9.6!用81个项目带你从Python 3零基础到Python自动化
Python的名字来自超现实主义的英国喜剧团体,而不是来自蛇。Python程序员被亲切地称为Pythonistas。Monty Python和与蛇相关的引用常常出现在Python的指南和文档中。
|
4天前
|
机器人 Java 测试技术
《手把手教你》系列技巧篇(六十)-java+ selenium自动化测试 - 截图三剑客 -中篇(详细教程)
【6月更文挑战第1天】本文介绍了使用Java和Selenium进行自动化测试时的另一种截图方法,即利用Robot类实现全屏截图。Robot类能够捕获屏幕上的所有内容,包括任务栏和浏览器元素。测试场景包括访问指定网站、调用截图方法和保存截图。示例代码展示了如何使用Robot创建全屏截图并保存到特定文件夹。在运行代码前,需确保指定的保存路径存在,否则会报错。
19 4
|
5天前
|
敏捷开发 Java 测试技术
深入理解自动化测试框架Selenium的设计理念与最佳实践
【5月更文挑战第31天】 在现代软件开发过程中,自动化测试是确保产品质量和加快交付速度的关键因素。Selenium作为一种广泛使用的自动化测试框架,它支持多种浏览器、操作系统和编程语言,极大地方便了测试人员编写和维护测试用例。本文将探讨Selenium的核心设计理念,包括其架构、组件和工作流程,并分享如何在实际项目中应用Selenium的最佳实践,以提高测试效率和准确性。通过分析真实案例,我们将展示Selenium如何帮助企业实现持续集成和持续部署(CI/CD)的目标,同时保证软件的稳定性和可靠性。
|
6天前
|
前端开发 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【5月更文挑战第30天】 本文将深入探讨和分析自动化测试框架Selenium的设计理念、架构以及其在实际开发中的应用。Selenium作为一款广泛使用的开源自动化测试工具,它的灵活性和高效性使其成为Web应用测试的首选工具。文章将从Selenium的核心组件出发,详细解析其工作原理,并结合实际案例讨论如何优化测试脚本,提高测试效率。此外,还将介绍Selenium Grid的使用,展示如何通过分布式测试加速测试过程。最后,文章将展望Selenium在未来技术演进中可能面临的挑战和发展方向。
|
6天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(五十九)-java+ selenium自动化测试 - 截图三剑客 -上篇(详细教程)
【5月更文挑战第23天】本文介绍了使用Java和Selenium进行自动化测试时如何实现截图操作。原本计划讲解远程测试内容,但因服务器网络问题无法进行,因此转而分享Selenium的截图方法。文章分为三部分,首先简述背景,然后重点介绍了TakeScreenshout类,这是一个用于获取浏览器窗口内容的截图工具,不包含浏览器菜单和任务栏。接着,列举了一个测试场景:访问百度首页并截图保存。最后,提供了代码示例,展示了如何设计自动化测试代码以及截图保存到指定目录,并附有代码运行效果展示。
22 2

热门文章

最新文章