您的位置:首页 > 编程语言 > Python开发

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框架功能简述如下:

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
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

# -*- 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: