在掌握了urllib几个模块的相关用法后,接下来就是进入实战步骤了~

(一)抓取豆瓣网站同城活动

豆瓣北京同城活动  该链接指向豆瓣同城活动的列表,向该链接发起request:

# encoding=utf-8
import urllib
import urllib2
import cookielib
import recj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))url="http://beijing.douban.com/events/future-all?start=0"
req=urllib2.Request(url)
event=urllib2.urlopen(req)
str1=event.read()

我们会发现返回的html代码中,除了我们需要的信息之外,还夹杂了大量的页面布局代码:

如上图所示,我们只需要中间那些关于活动的信息。而为了提取信息,我们就需要正则表达式了~

正则表达式是一种跨平台的字符串处理工具/方法,通过正则表达式,我们可以比较轻松的提取字符串中我们想要的内容~

这里不做详细介绍了,个人推荐余晟老师的正则指引,挺适合新手入门的。下面给出正则表达式的大致语法:

这里我使用捕获分组,将活动四要素(名称,时间,地点,费用)为标准进行分组,得到的表达式如下:

regex=re.compile(r'summary">([\d\D]*?)</span>[\d\D]*?class="hidden-xs">([\d\D]*?)<time[\d\D]*?<li title="([\d\D]*?)">[\d\D]*?strong>([\d\D]*?)</strong>')

这样就可以将几个部分提取出来了。

总体代码如下:

# -*- coding: utf-8 -*-
#---------------------------------------
#   program:豆瓣同城爬虫
#   author:GisLu
#   data:2014-02-08
#---------------------------------------import urllib
import urllib2
import cookielib
import recj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))#正则提取
def search(str1):regex=re.compile(r'summary">([\d\D]*?)</span>[\d\D]*?class="hidden-xs">([\d\D]*?)<time[\d\D]*?<li title="([\d\D]*?)">[\d\D]*?strong>([\d\D]*?)</strong>')for i in regex.finditer(str1):print "活动名称:",i.group(1)a=i.group(2)b=a.replace('</span>','')print b.replace('\n','')print '活动地点:',i.group(3)c=i.group(4).decode('utf-8')print '费用:',c#获取url
for i in range(0,5):url="http://beijing.douban.com/events/future-all?start="url=url+str(i*10)req=urllib2.Request(url)event=urllib2.urlopen(req)str1=event.read()search(str1)

在这里需要注意一下编码的问题,因为我使用的版本还是python2.X,所以在内部汉字字符串传递的时候需要来回转换,比如在最后打印“费用“这一项的时候,必须使用

i.group(4).decode('utf-8') 将group(4元组中的ASCII码转换为utf8格式才行,否则会发现输出的是乱码。

而在python中,正则模块re提供了两种常用的全局查找方式:findall 和 finditer,其中findall是一次性处理完毕,比较消耗资源;而finditer则是迭代进行搜索,个人比较推荐使用这一方法。

最后得到的结果如下,大功告成~

(二)模拟登陆图书馆系统查询书籍归还情况

既然我们能够通过python向指定网站发出请求获取信息,那么自然也能通过python模拟浏览器进行登陆等操作~

而模拟的关键,就在于我们向指定网站服务器发送的信息需要和浏览器的格式一模一样才行~

这就需要分析出我们想要登陆的那个网站接受信息的方式。通常我们需要对浏览器的信息交换进行抓包~

抓包软件中,目前比较流行的是wireshark,相当强大~不过对于我们新手来说,IE、Foxfire或者chrome自带的工具就足够我们使用了~

这里就以本人学校的图书馆系统为例子~

我们可以通过模拟登陆,最后进入图书管理系统查询我们借阅的图书归还情况。首先要进行抓包分析我们需要发送哪些信息才能成功模拟浏览器进行登陆操作。

我使用的是chrome浏览器,在登陆页面按F12调出chrome自带的开发工具,选择network项就可以输入学号密码选择登陆了。

观察登陆过程中的网络活动,果然发现可疑分子了:

分析这个post指令后,可以确认其就是发送登陆信息(账号、密码等)的关键命令。

还好我们学校比较穷,网站做的一般,这个包完全没有加密~那么剩下的就很简单了~记下headers跟post data就OK了~

其中headers中有很多实用的信息,一些网站可能会根据user-Agent来判断你是否是爬虫程序从而决定是否允许你访问,而Referer则是很多网站常常用来反盗链的,如果服务器接收到的请求中referer与管理员设定的规则不符,那么服务器也会拒绝发送资源。

而post data就是我们在登录过程中浏览器向登陆服务器post的信息了,通常账户、密码之类的数据都包含在里面。这里往往还有一些其他的数据如布局等信息也要发送出去,这些信息通常我们在操作浏览器的时候没有任何存在感,但没了他们服务器是不会响应我们滴。

现在postdata 跟headers的格式我们全部知道了~模拟登陆就很简单了:

import urllib
#---------------------------------------
#   @program:图书借阅查询
#   @author:GisLu
#   @data:2014-02-08
#---------------------------------------import urllib2
import cookielib
import recj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')]urllib2.install_opener(opener)#登陆获取cookies
postdata=urllib.urlencode({'user':'X1234564','pw':'demacialalala','imageField.x':'0','imageField.y':'0'})rep=urllib2.Request(url='http://210.45.210.6/dzjs/login.asp',data=postdata)
result=urllib2.urlopen(rep)
print result.geturl()

其中urllib.urlencode负责将postdata自动进行格式转换,而opener.addheaders则是在我们的opener处理器中为后续请求添加我们预设的headers。

测试后发现,登陆成功~~

那么剩下的就是找出图书借还查询所在页面的url,再用正则表达式提取出我们需要的信息了~~

整体代码如下:

import urllib
#---------------------------------------
#   @program:图书借阅查询
#   @author:GisLu
#   @data:2014-02-08
#---------------------------------------import urllib2
import cookielib
import recj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')]urllib2.install_opener(opener)#登陆获取cookies
postdata=urllib.urlencode({'user':'X11134564','pw':'demacialalala','imageField.x':'0','imageField.y':'0'})rep=urllib2.Request(url='http://210.45.210.6/dzjs/login.asp',data=postdata)
result=urllib2.urlopen(rep)
print result.geturl()#获取账目表Postdata=urllib.urlencode({'nCxfs':'1','submit1':'检索'})aa=urllib2.Request(url='http://210.45.210.6/dzjs/jhcx.asp',data=Postdata)
bb=urllib2.urlopen(aa)
cc=bb.read()
zhangmu=re.findall('tdborder4  >(.*?)</td>',cc)for i in zhangmu:i=i.decode('gb2312')i=i.encode('gb2312')print i.strip('&nbsp; ')

下面是程序运行结果~







python简单爬虫(下):实战应用——抓取豆瓣同城、登陆图书馆查询图书归还相关推荐

  1. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中

    小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...

  2. 网络爬虫--python抓取豆瓣同城北京地区活动信息

    感谢主赐予我们时光. 本内容只涉及技术探讨,不作为商业用途. 背景 作为入门级的爬虫,其实不需要了解复杂的正则表达式匹配,高深的网络协议.只需要了解一些基本的python语法和html请求/响应原理就 ...

  3. Python网络爬虫:利用正则表达式爬取豆瓣电影top250排行前10页电影信息

    在学习了几个常用的爬取包方法后,转入爬取实战. 爬取豆瓣电影早已是练习爬取的常用方式了,网上各种代码也已经很多了,我可能现在还在做这个都太土了,不过没事,毕竟我也才刚入门-- 这次我还是利用正则表达式 ...

  4. python爬取豆瓣读书_用python+selenium抓取豆瓣读书中最受关注图书并按照评分排序...

    抓取豆瓣读书中的(http://book.douban.com/)最受关注图书,按照评分排序,并保存至txt文件中,需要抓取书籍的名称,作者,评分,体裁和一句话评论 方法一:#coding=utf-8 ...

  5. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  6. Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转

    数据来源:数据挖掘入门与实战  公众号: datadw scrapy_jingdong[9]- 京东爬虫.基于scrapy的京东网站爬虫,保存格式为csv.[9]: https://github.co ...

  7. Python异步爬虫之协程抓取妹子图片(aiohttp、aiofiles)

    目录 前言 一.什么是协程? 二.协程的优势 三.代码分析 1.引入库 2.获取所有时间线的链接 3.获取一个时间线中所有相册的链接 4.获取一个相册中所有的图片链接以及相册的名字 5.下载并保存图片 ...

  8. Python学习笔记 第二部分 - 正则表达式 与 爬虫小实例(抓取豆瓣电影中评分大于等于8分的影片)...

    一.正则表达式 python正则常用的函数和方法 compile(pattern,flags=0)        对正则表达式pattern进行编译,flags是可选标识符,并返回一个regex对象 ...

  9. python爬虫实例-运用requests抓取豆瓣电影TOP250(详解)

    目录 开发工具 目标 网页分析 正则匹配分析 代码实例 总结 开发工具 python版本: python-3.8.1-amd64 python开发工具: JetBrains PyCharm 2018. ...

最新文章

  1. linux架构接口层教程,在LINUX平台上进行成功实现RIL层功能和框架层应用
  2. Mac 终端便利工具: 管理工具-Homebrew 和提示工具oh my zsh
  3. android logger的使用
  4. Cocos2dx中零散知识点
  5. js判断ipad还是安卓_JS判断客户端是否是iOS或者Android
  6. HTML+CSS+JS实现 ❤️canvas 3D云动画效果❤️
  7. Tiny快速入门之服务开发
  8. ElasticSearch 2 (16) - 深入搜索系列之近似度匹配
  9. winform datagridview 自定义tooltip
  10. Ghost 博客平台安装和配置
  11. 天黑时间跟经度还是纬度有关_经纬度和时间气候
  12. 前端页面闪动(vue+ele 表格分页)
  13. 考研英语——长难句语法
  14. mac mysql excel乱码_Mac Mysql数据库中文乱码问题解决
  15. GBase 8c 安全特性
  16. 图-介绍(intro-Graph)
  17. MYSQL计算日期差和时间差的函数
  18. linux 子程序返回错误代码,execvp:在程序中调子程序并获取返回值
  19. 独立性权重指标怎么计算?
  20. MBIST --- PATR1.Memorybist测试原理

热门文章

  1. Circle Loss
  2. bottle 文件服务器,Python库glances和Bottle完成服务器交互式动态监控
  3. C# NanoFramework 开发单片机嵌入式之 ESP32
  4. java的依赖注入_Java依赖注入的三种方式
  5. spring 依赖注入的三种方式
  6. java之四大淡水湖问题_[讨论]四大淡水湖的大小排序问题(逻辑题)
  7. 服务器IIS安全加固防御
  8. 乌鸫科技一面凉(电话面试)
  9. web前端开发需要学习什么?
  10. 以太坊外部账户EOA与合约账户CA的区别