Python selenium自动化网页抓取器

(开开心心每一天~ ---虫瘾师)
直接入正题---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 selenium自动化网页抓取器的更多相关文章
- python爬虫 前程无忧网页抓取
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- Python实现简单的网页抓取
现在开源的网页抓取程序有很多,各种语言应有尽有. 这里分享一下Python从零开始的网页抓取过程 第一步:安装Python 点击下载适合的版本https://www.python.org/ 我这里选择 ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- python网络爬虫-动态网页抓取(五)
动态抓取的实例 在开始爬虫之前,我们需要了解一下Ajax(异步请求).它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新. 如果使用Ajax加载的动态网页抓取,有两种方法: 通过浏览器审查 ...
- Python网络爬虫笔记(一):网页抓取方式和LXML示例
(一) 三种网页抓取方法 1. 正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2. Beautiful Soup 模块使用Python编写,速度慢. ...
- Python爬虫之三种网页抓取方法性能比较
下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块. 1. 正则表达式 如果你对正则表达式还不熟悉,或是需要一些提 ...
- Python之HTML的解析(网页抓取一)
http://blog.csdn.net/my2010sam/article/details/14526223 --------------------- 对html的解析是网页抓取的基础,分析抓取的 ...
- Spider_基础总结6--动态网页抓取--selenium
# 有些网站使用 '检查元素'也不能够好使,它们会对地址进行加密,此时使用Selenium 调用浏览器渲染引擎可以模拟用户的操作,完成抓取: # 注:selenium既可以抓取静态网页也可以抓取动态网 ...
- Java---网络蜘蛛-网页邮箱抓取器~源码
刚刚学完Socket,迫不及待的做了这个网页邮箱抓取~~~ 现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎.资讯采集.舆情监测等等,诸如此类.网络爬虫涉及 ...
随机推荐
- gunicorn 信号处理(SIGHUP,SIGUSR2)
在这篇文章中,提到了Master进程对信号的处理函数,其中有两个信号比较有意思. SIGHUP:用来热更新(Reload)应用 SIGUSR2:用来在线升级(upgrade on the fly)gu ...
- ViewPager+Fragment 懒加载
转载于: 作者:尹star链接:http://www.jianshu.com/p/c5d29a0c3f4c來源:简书 ViewPager+Fragment的模式再常见不过了,以国民应用微信为例,假 ...
- java String,StringBuffer和StringBulder学习笔记
1.String:不可改变的Unicode字符序列. 池化思想,把需要共享的数据放在池中,用一个存储区域来存放一些公用资源以减少存储空间的开销. 在String类中,以字面值创建时,回到java方法空 ...
- 开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面
NanUI是什么 NanUI基于ChromiumFX项目进行开发,它能让你在你的Winform应用程序中使用HTML5/CSS3/Javascript等网页技术来呈现用户界面(类似Electron). ...
- Huffman 哈夫曼编码与译码的原理剖析及C++实现
原理 我们在信息存储时,希望以最少的空间去存储最大的数据,方便数据的传输,那么该怎样做呢? 我们想到将源信息转化为01序列存储,但是这样以来又有一个问题,就是子串匹配问题,我们为了解决这个方法,想到了 ...
- iOS 电脑新装的系统, 使用sourceTree 创建本地仓库的时候, 总是提示, 无效路径
把qq聊天记录分享出来: 我电脑新装的系统, 使用sourceTree 创建本地仓库的时候, 总是提示, 无效路径请问哪位遇到过求指教群里有产品经理没有? ssh 配制的不对重装系统过后,重新生成一下 ...
- stack 的优势 - 每天5分钟玩转 Docker 容器技术(113)
stack 将应用所包含的 service,依赖的 secret.voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中.相比较手工执行命令或是脚本,stack 有明显的优势. YAML ...
- 树形dp系列
1.火车站开饭店 最大独立集裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include< ...
- Docker(四):Docker基本网络配置
1.Libnetwork Libnetwork提出了新的容器网络模型简称为CNM,定义了标准的API用于为容器配置网络. CNM三个重要概念: 沙盒:一个隔离的网络运行环境,保存了容器网络栈的配置,包 ...
- lesson - 9 Linux系统软件包管理
1. rpm工具rpm Redhat Package Manager, 设计理念是开放的,不仅仅是在RedHat平台上,在SUSE上也是可以使用的. rpm包名字构成由-和.分成了若干部分,如abrt ...