侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   167

直接入正题---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 webdriverfrom bs4 import BeautifulSoupimport requestsfrom pymongo import MongoClient,ASCENDING, DESCENDINGimport timeimport re

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

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

先说一下selenium 的定位方法

find_element_by_idfind_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector

源码:

from selenium import webdriverfrom bs4 import BeautifulSoupimport requestsfrom pymongo import MongoClient,ASCENDING, DESCENDINGimport timeimport redef 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 eif __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开始的增长型iddb[table].insert({"ids":ids,"数据":数据})   

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

最后来一个实例源码:

from selenium import webdriverfrom bs4 import BeautifulSoupimport requestsfrom pymongo import MongoClient,ASCENDING, DESCENDINGimport timeimport redef 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 edef 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 edef 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使用pil库实现图片合成实例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客