Python实战:爬虫的基础
2016-05-18 00:02
671 查看
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。当然也可以理解为在网络上爬行的蜘蛛,把互联网比作一张大网,而爬虫便是在这网上爬来爬去的蜘蛛,如果遇到资源就会把它取下来,想抓取什么,由你来决定。
首先、要学习python爬虫要掌握一下几点:
python基础知识
python中urllib和urllib2库的用法
python正则表达式
python爬虫框架Scrapy
Python爬虫更高级的功能
1、python基础知识可以在前几篇有介绍
2、urllib和urllib2库是学习python爬虫最基本的库,利用这个库可以得到网页的内容,并对内容用正则表达式提取分析,得到我们想要的结果,
3、python正则表达式
python正则表达式是一种用来匹配字符串的强有力的工具,它的设计是有一种描述性语言来给字符串定义一个规则,凡是符合规则的字符串,我们就可以认为它‘匹配’了,否则,该字符串就是不合法的。
4、爬虫框架scrap
scrap框架功能简述如下:
官方文档:http://doc.scrapy.org/en/latest/
5、简单的扒下一个网页。
在网页中其实就是代码通过浏览器解释呈现出来,实质是由一段HTML代码,加JS、CSS,如果把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。所以最重要的部分是存在与HTML中的。下面就说小例子:
可以直接执行一下感受下爬虫的魅力。
这里解析一下上面的代码,首先是utllib2库里面的urlopen方法,传入一个url,这个网址是百度的首页,协议是http协议,当然也可以换成其他的例如:ftp、file、https等等,只是代表了一种访问控制协议,urlopen一般接受三个参数,参数如下:
参数url即为url,data是访问url时要传送的数据,timeout是设置超时时间。data和timeout可以不传送,data默认为空None,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT。第一个参数url是必须要传送的,在这个例子里我们传送了百度的url,执行urlopen方法之后,返回一个response对象,返回信息保存在这里。
response对象有一个read方法,可以返回获取到此的网页内容。
如果不加read直接打印就会有如下错误:
直接打印出了该对象的描述,所以记得一定要加read方法,否则它不出来内容。
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
pipelines
上述中的pipelines中有多个类,到底Scapy会自动执行那个?哈哈哈哈,当然需要先配置了,不然Scapy就蒙逼了。。。
在settings.py中做如下配置:
更多请参见Scrapy文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
文档参考: http://python.jobbole.com/81336/
http://www.cnblogs.com/wupeiqi/articles/5354900.html
首先、要学习python爬虫要掌握一下几点:
python基础知识
python中urllib和urllib2库的用法
python正则表达式
python爬虫框架Scrapy
Python爬虫更高级的功能
1、python基础知识可以在前几篇有介绍
2、urllib和urllib2库是学习python爬虫最基本的库,利用这个库可以得到网页的内容,并对内容用正则表达式提取分析,得到我们想要的结果,
3、python正则表达式
python正则表达式是一种用来匹配字符串的强有力的工具,它的设计是有一种描述性语言来给字符串定义一个规则,凡是符合规则的字符串,我们就可以认为它‘匹配’了,否则,该字符串就是不合法的。
4、爬虫框架scrap
scrap框架功能简述如下:
HTML, XML源数据 选择及提取 的内置支持 提供了一系列在spider之间共享的可复用的过滤器(即 Item Loaders),对智能处理爬取数据提供了内置支持。 通过 feed导出 提供了多格式(JSON、CSV、XML),多存储后端(FTP、S3、本地文件系统)的内置支持 提供了media pipeline,可以 自动下载 爬取到的数据中的图片(或者其他资源)。 高扩展性。您可以通过使用 signals ,设计好的API(中间件, extensions, pipelines)来定制实现您的功能。 内置的中间件及扩展为下列功能提供了支持: cookies and session 处理 HTTP 压缩 HTTP 认证 HTTP 缓存 user-agent模拟 robots.txt 爬取深度限制 针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持。 支持根据模板生成爬虫。在加速爬虫创建的同时,保持在大型项目中的代码更为一致。详细内容请参阅 genspider 命令。 针对多爬虫下性能评估、失败检测,提供了可扩展的 状态收集工具 。 提供 交互式shell终端 , 为您测试XPath表达式,编写和调试爬虫提供了极大的方便 提供 System service, 简化在生产环境的部署及运行 内置 Web service, 使您可以监视及控制您的机器 内置 Telnet终端 ,通过在Scrapy进程中钩入Python终端,使您可以查看并且调试爬虫 Logging 为您在爬取过程中捕捉错误提供了方便 支持 Sitemaps 爬取 具有缓存的DNS解析器
官方文档:http://doc.scrapy.org/en/latest/
5、简单的扒下一个网页。
在网页中其实就是代码通过浏览器解释呈现出来,实质是由一段HTML代码,加JS、CSS,如果把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。所以最重要的部分是存在与HTML中的。下面就说小例子:
import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.read()
可以直接执行一下感受下爬虫的魅力。
这里解析一下上面的代码,首先是utllib2库里面的urlopen方法,传入一个url,这个网址是百度的首页,协议是http协议,当然也可以换成其他的例如:ftp、file、https等等,只是代表了一种访问控制协议,urlopen一般接受三个参数,参数如下:
urlopen(url, data, timeout)
参数url即为url,data是访问url时要传送的数据,timeout是设置超时时间。data和timeout可以不传送,data默认为空None,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT。第一个参数url是必须要传送的,在这个例子里我们传送了百度的url,执行urlopen方法之后,返回一个response对象,返回信息保存在这里。
print response.read()
response对象有一个read方法,可以返回获取到此的网页内容。
如果不加read直接打印就会有如下错误:
<addinfourl at 139728495260376 whose fp = <socket._fileobject object at 0x7f1513fb3ad0>>
直接打印出了该对象的描述,所以记得一定要加read方法,否则它不出来内容。
Requset |
# -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html import json from twisted.enterprise import adbapi import MySQLdb.cursors import re mobile_re = re.compile(r'(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}') phone_re = re.compile(r'(\d+-\d+|\d+)') class JsonPipeline(object): def __init__(self): self.file = open('/Users/wupeiqi/PycharmProjects/beauty/beauty/jieyicai.json', 'wb') def process_item(self, item, spider): line = "%s %s\n" % (item['company'][0].encode('utf-8'), item['title'][0].encode('utf-8')) self.file.write(line) return item class DBPipeline(object): def __init__(self): self.db_pool = adbapi.ConnectionPool('MySQLdb', db='DbCenter', user='root', passwd='123', cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True) def process_item(self, item, spider): query = self.db_pool.runInteraction(self._conditional_insert, item) query.addErrback(self.handle_error) return item def _conditional_insert(self, tx, item): tx.execute("select nid from company where company = %s", (item['company'][0], )) result = tx.fetchone() if result: pass else: phone_obj = phone_re.search(item['info'][0].strip()) phone = phone_obj.group() if phone_obj else ' ' mobile_obj = mobile_re.search(item['info'][1].strip()) mobile = mobile_obj.group() if mobile_obj else ' ' values = ( item['company'][0], item['qq'][0], phone, mobile, item['info'][2].strip(), item['more'][0]) tx.execute("insert into company(company,qq,phone,mobile,address,more) values(%s,%s,%s,%s,%s,%s)", values) def handle_error(self, e): print 'error',e
pipelines
上述中的pipelines中有多个类,到底Scapy会自动执行那个?哈哈哈哈,当然需要先配置了,不然Scapy就蒙逼了。。。
在settings.py中做如下配置:
ITEM_PIPELINES = { 'beauty.pipelines.DBPipeline': 300, 'beauty.pipelines.JsonPipeline': 100, } # 每行后面的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内。
更多请参见Scrapy文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
文档参考: http://python.jobbole.com/81336/
http://www.cnblogs.com/wupeiqi/articles/5354900.html
相关文章推荐
- Python performance
- PySide——Python图形化界面
- Python 代码性能优化
- python匹配ip正则
- python 基于次世代验证码识别系统的小demo
- 发现使用python+tushare做量化交易 其实不是很难
- kombu------python的消息库
- python 安装 cairo
- 步步学习之用python实战机器学习1-kNN (K-NearestNeighbors)算法(a)
- 简单的python爬取网页字符串内容并保存
- python一些内建函数(map,zip,filter,reduce,yield等)
- Python之常用模块(待更新)
- Tornado X MVC
- [Python笔记]第九篇:re正则表达式
- python
- python学习笔记5—数据类型转换
- python range() 和xrange()的区别
- python交互模式下方向键、退格键出现乱码及ipython的安装
- 练习010
- 理解Python中的with…as…语法