学习Python selenium自动化网页抓取器


Posted in Python onJanuary 20, 2018

直接入正题---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 ,该模块就是你的责任!

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

引入模块:

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
from pymongo import MongoClient,ASCENDING, DESCENDING
import time
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

源码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最后来一个实例源码:

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
from pymongo import MongoClient,ASCENDING, DESCENDING
import time
import re
def parser():
 try:
  f = open('sitemap.txt','r')
  for i in f.readlines():
   sorturl=i.strip()
   driver = webdriver.Firefox()
   driver.get(sorturl)
   time.sleep(50)
   ht = driver.page_source
   #pageurl(ht)
   soup = BeautifulSoup(ht,'html.parser')
   a = soup.find('a',class_="first-last")
   if a:
    pagenum = int(a.get_text().strip())
    print pagenum
    for i in xrange(1,pagenum):
     element = driver.find_element_by_xpath('//a[@id="ctl00_ContentMain_PagerTop_%s"]' %i)
     element.click()
     html = element.page_source
     pageurl(html)
     time.sleep(50)
     driver.quit()
 except Exception,e:
  print e
def pageurl(ht):
 try:
  soup = BeautifulSoup(ht,'html.parser')
  a = soup.find('table',id="ctl00_ContentMain_SearchResultsGrid_grid")
  if a:
   tr = a.find_all('tr',class_="SearchResultsRowOdd")
   if tr:
     for i in tr:
      td = i.find_all('td')
      if td:
       url = td[2].find('a')
       if url:
        producturl = '网址'+url['href']
        print producturl
        count = db[table].find({"url":producturl}).count()
        if count<=0:
         sn = getNewsn()
         db[table].insert({"sn":sn,"url":producturl})
         print str(sn) + ' inserted successfully'
         time.sleep(3)
        else:
         print 'exists url'
   tr1 = a.find_all('tr',class_="SearchResultsRowEven")
   if tr1:
     for i in tr1:
      td = i.find_all('td')
      if td:
       url = td[2].find('a')
       if url:
        producturl = '网址'+url['href']
        print producturl
        count = db[table].find({"url":producturl}).count()
        if count<=0:
         sn = getNewsn()
         db[table].insert({"sn":sn,"url":producturl})
         print str(sn) + ' inserted successfully'
         time.sleep(3)
        else:
         print 'exists url'
        #time.sleep(5)
 except Exception,e:
  print e
def getNewsn(): 
 db.sn.find_and_modify({"_id": table}, update={ "$inc"{'currentIdValue': 1}},upsert=True)
 dic = db.sn.find({"_id":table}).limit(1)
 return dic[0].get("currentIdValue")
if __name__ == '__main__': 
 global db     
 global table
 table = 'mous_product'
 mconn=MongoClient("mongodb://localhost")
 db=mconn.test
 db.authenticate('test','test')
 parser()

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

Python 相关文章推荐
python多线程操作实例
Nov 21 Python
Python下的twisted框架入门指引
Apr 15 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
pandas重新生成索引的方法
Nov 06 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 Python
python使用torch随机初始化参数
Mar 22 Python
python使用pil库实现图片合成实例代码
Jan 20 #Python
python方向键控制上下左右代码
Jan 20 #Python
Python线程创建和终止实例代码
Jan 20 #Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 #Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 #Python
浅谈flask中的before_request与after_request
Jan 20 #Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 #Python
You might like
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
详解JavaScript中的函数、对象
2019/04/01 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
北京银河万佳Java面试题
2012/03/21 面试题
毕业生的自我评价
2013/12/30 职场文书
上课迟到检讨书
2014/02/19 职场文书
2015暑假假期总结
2015/07/13 职场文书
小学思想品德教学反思
2016/02/24 职场文书
详细介绍python操作RabbitMq
2022/04/12 Python
Redis批量生成数据的实现
2022/06/05 Redis