python 网页自动化_Python selenium自动化网页抓取器

1115722-20180119154451037-1880145667.png

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

直接入正题---Python selenium自动控制浏览器对网页的数据进行抓取,其中包含按钮点击、跳转页面、搜索框的输入、页面的价值数据存储、mongodb自动id标识等等等。

1、首先介绍一下 Python selenium ---自动化测试工具,用来控制浏览器来对网页的操作,在爬虫中与BeautifulSoup结合那就是天衣无缝,除去国外的一些变态的验证网页,对于图片验证码我有自己写的破解图片验证码的源代码,成功率在85%。

详情请咨询QQ群--607021567(这不算广告,群里有好多Python的资源分享,还有大数据的一些知识【hadoop】)

3、关于mongodb的自动id的生成。mongodb中所有的存储数据都是有固定的id的,但是mongodb的id对于人类来讲是复杂的,对于机器来讲是小菜一碟的,所以在存入数据的同时,我习惯用新id来对每一条数据的负责!

在Python中使用mongodb的话需要引进模块 from pymongo import MongoClient,ASCENDING, DESCENDING ,该模块就是你的责任!

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

引入模块:

1 from selenium importwebdriver2 from bs4 importBeautifulSoup3 importrequests4 from pymongo importMongoClient,ASCENDING, DESCENDING5 importtime6 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 importwebdriver2 from bs4 importBeautifulSoup3 importrequests4 from pymongo importMongoClient,ASCENDING, DESCENDING5 importtime6 importre7

8 defTaoBao():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 exceptException,e:20 printe21

22 if __name__ == '__main__':23 TaoBao()

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

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

1 ht =driver.page_source2 #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 importMongoClient,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.test8 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 importwebdriver2 from bs4 importBeautifulSoup3 importrequests4 from pymongo importMongoClient,ASCENDING, DESCENDING5 importtime6 importre7 defparser():8 try:9 f = open('sitemap.txt','r')10 for i inf.readlines():11 sorturl=i.strip()12 driver =webdriver.Firefox()13 driver.get(sorturl)14 time.sleep(50)15 ht =driver.page_source16 #pageurl(ht)

17 soup = BeautifulSoup(ht,'html.parser')18 a = soup.find('a',class_="first-last")19 ifa:20 pagenum =int(a.get_text().strip())21 printpagenum22 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_source26 pageurl(html)27 time.sleep(50)28 driver.quit()29 exceptException,e:30 printe31 defpageurl(ht):32 try:33 soup = BeautifulSoup(ht,'html.parser')34 a = soup.find('table',id="ctl00_ContentMain_SearchResultsGrid_grid")35 ifa:36 tr = a.find_all('tr',class_="SearchResultsRowOdd")37 iftr:38 for i intr:39 td = i.find_all('td')40 iftd:41 url = td[2].find('a')42 ifurl:43 producturl = '网址'+url['href']44 printproducturl45 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 iftr1:55 for i intr1:56 td = i.find_all('td')57 iftd:58 url = td[2].find('a')59 ifurl:60 producturl = '网址'+url['href']61 printproducturl62 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 exceptException,e:73 printe74 defgetNewsn():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 globaldb82 globaltable83 table = 'mous_product'

84 mconn=MongoClient("mongodb://localhost")85 db=mconn.test86 db.authenticate('test','test')87 parser()

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

loading.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值