python 爬虫实例_Python 爬虫:Mechanize 实例(一)

该博客通过Python的Mechanize库和BeautifulSoup解析器,演示了如何登录光猫并抓取F460型号光猫的设备信息,包括运营商名称、型号、序列号等关键数据。
摘要由CSDN通过智能技术生成

一次性付费进群,长期免费索取教程,没有付费教程。

进微信群回复公众号:微信群;QQ群:460500587

 教程列表  见微信公众号底部菜单 |   本文底部有推荐书籍 

334919110ba557d821b56b617a943cb6.png

微信公众号:计算机与网络安全

ID:Computer-network

使用urllib2可以比较方便地处理那些无须验证码的登录页面,不过使用Mechanize登录更加方便。当然是怎么方便怎么做。下面以抓取光猫F460的设置页面为例,使用Mechanize配合bs4抓取光猫F460的数据。 1、获取F460数据 启动Eclipse,新建PyDev项目MechanizeAndBs4。在新项目中创建一个PyDev Module文件getF460Info.py。 getF460Info.py的内容如下:

1 #!/usr/bin/evn python

2 #-*- coding: utf-8 -*-

3 '''

4 Created on 

5

6 @author: hstking hst_king@hotmail.com

7 '''

8

9 import mechanize

10 from bs4 import BeautifulSoup

11 from mylog import MyLog as mylog

12

13

14 class F460Info(object):

15     '''获取光猫f460的信息 '''

16     def __init__(self):

17         self.url = 'http://192.168.1.1/'

18         self.log = mylog()

19         self.username = 'admin'

20         self.password = '******' #这里输入光猫的密码

21         self.spider()

22

23

24     def spider(self):

25         responseContent = self.getResponseContent(self.url)

26         if not responseContent:

27             self.log.error('the response is null')

28             exit()

29         soup = BeautifulSoup(responseContent, 'lxml')

30         modemInfo = {}

31         modemInfo['CarrierName'] = soup.find('td',attrs={'id':'Frm_CarrierName'}).get_text().strip()

32         modemInfo['modelName'] = soup.find('td',attrs={'id':'Frm_ModelName'}).get_text().strip()

33         modemInfo['SerialNumber'] = soup.find('td',attrs={'id':'Frm_SerialNumber'}).get_text().strip()

34         modemInfo['HardwareVer'] = soup.find('td',attrs={'id':'Frm_HardwareVer'}).get_text().strip()

35         modemInfo['SoftwareVer'] = soup.find('td',attrs={'id':'Frm_SoftwareVer'}).get_text().strip()

36         modemInfo['BootVer'] = soup.find('td',attrs={'id':'Frm_BootVer'}).get_text().strip()

37         modemInfo['VerDate'] = soup.find('td',attrs={'id':'Frm_VerDate'}).get_text().strip()

38

39         self.pipeline(modemInfo)

40

41

42     def getResponseContent(self, url):

43         self.log.info(u'begin create mechanize browser')

44         br = mechanize.Browser()

45         br.set_handle_equiv(True)

46         br.set_handle_gzip(False)

47         br.set_handle_redirect(True)

48         br.set_handle_referer(True)

49         br.set_handle_robots(False)

50         br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),max_time=1)

51    br.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36')]

52

53         self.log.info(u'open url on mechanize browser')

54         try:

55             br.open(url)

56         except:

57             self.log.error(u'open %s failed' %url)

58             return ''

59         br.select_form(nr=0)

60         br.form['Username'] = self.username

61         br.form['Password'] = self.password

62         br.submit()

63

64         newUrl = url + 'template.gch'

65         try:

66             br.open(newUrl)

67         except:

68             self.log.error(u'open %s failed' %newUrl)

69             return ''

70         else:

71             return br.response().read()

72

73

74     def pipeline(self, info):

75         fileName = u'f460ModemInfo.txt'.encode('gbk')

76         with open(fileName, 'w') as fp:

77             for key in info.keys():

78                 print('%s \t %s \n' %(key.encode('utf8'),info.get(key).encode('utf8')))

79                 fp.write('%s \t %s \n' %(key.encode('utf8'),info.get(key).encode('utf8')))

80

81

82 if __name__ == '__main__':

83     fi = F460Info()

然后将mylog.py复制到MechanizeAndBs4项目下,单击Eclipse图标栏的运行图标,执行结果如图1所示。

eb9d8a2e91e5001d28f8795cbb418b2b.png

图1  运行getF460Info.py 爬虫 程序运行无误,已经得到了预期的效果。 2、代码分析 这个爬虫大部分和bs4爬虫没有什么区别,只是用Mechanize模块代替了urllib2模块。 在不需要输入验证码的情况下,Mechanize还是很简单方便的。 下面来看看这个程序中的代码作用。 第9~11行是导入模块,很标准的Python程序流程。 第16~21行是F460Info类的解析函数,定义了几个变量。 在C语言中定义这种类似的变量,一般都是在文件头使用define。 Python 中没有define,放在这里正好合适,修改也很方便。 第24~39行是spider类函数。 这个函数的作用是通过BeautifulSoup从字符串中过滤抓取所需的数据。 在使用soup获取数据后,都使用strip函数去除了数据左右的空格、回车等不可见字符。 第42~71行是getResponseContent类函数。 作用是通过Mechanize模块来获取目标页面的返回数据。 第44行创建了一个浏览器对象,第45~51行都是对浏览器对象的设置。 这些设置并不是可有可无的,在打开某些网页时会因为这些设置的不同而得到不同的结果。 如果没有什么特殊要求,这样设置就可以了。 在编写程序之前,已经知道了最终的目标网页是http://192.168.1.1/template.gch,可在第53~62行还是用浏览器对象打开了http://192.168.1.1。 这是因为直接打开目标页面是得不到任何数据的,只有先登录http://192.168.1.1,得到合法的Cookie,然后利用这个Cookie才能打开目标页面。 第74~79行的pipeline类函数的作用是处理最终的结果,将结果存入文件。 这里直接使用open打开文件,数据中有中文字符,存入数据时必须使用encode将字符串转换成合法的数据后存入。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值