学习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之使用Python查询更新数据库
Nov 25 Python
Python使用xlrd读取Excel格式文件的方法
Mar 10 Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
Python线程详解
Jun 24 Python
python实现决策树分类算法
Dec 21 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
python抓取多种类型的页面方法实例
Nov 20 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
Python如何在DataFrame增加数值
Feb 14 Python
python基于socket函数实现端口扫描
May 28 Python
Python -m参数原理及使用方法解析
Aug 21 Python
python文件路径操作方法总结
Dec 21 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
第九节 绑定 [9]
2006/10/09 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
vue cli 全面解析
2018/02/28 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
Python实现一个简单的MySQL类
2015/01/07 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python学生管理系统开发
2019/01/30 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
python3图片文件批量重命名处理
2019/10/31 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
护理自荐信范文
2013/10/05 职场文书
实习生体会的自我评价范文
2013/11/28 职场文书
班委竞选稿范文
2015/11/21 职场文书