python Scrapy
由于项目要使用新闻,大量的数据所以想到了python的scrapy 下面大致讲一讲如何安装使用,直到整个新闻采集模块完成,网址什么的自己找 这里只是示范这里的项目环境是python 2.66 centos
1.Scrapy安装
1.1查看python版本因为官网上已经写清楚了要求2.7所以第一步升级Python版本
1.下载
wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
2.解压编译
1.tar -jxvf Python-2.7.3.tar.bz2
2.进入到Python-2.7.3./configure
然后make all再然后make install
3.然后查看版本信,我这个是安装到了/usr/local/bin/
执行/usr/local/bin/python2.7 -v
4.然后建立软链接
mv /usr/bin/python /usr/bin/python2.6.6
ln -s /usr/local/bin/python2.7 /usr/bin/python
5.这时候输入python 就会看到已经是python2.7了
然后这个时候发现yum 不能用了 要改下 /usr/bin/yum 把第一行的!/usr/bin/python改成 !/usr/bin/python2.6.6
2. pip在centos下默认是不行的yum search pip 是找不到的 所以yum install pip 根本就不行
然后所以这里要自己装了
将这个网页保存https://bootstrap.pypa.io/get-pip.py 然后python get-pip.py 如果此文件下载不下来的可以留言 毕竟我下了好久 还好是任务自动下载的
3. 然后
pip install Scrapy
这个可能会有一堆错误 我是安装了
yum update libxml2-devel libxslt-devel python-devel
其他错误就自己谷歌一下解决吧
4.测试
执行scrapy 如果有提示出来说明已经安装成功了,如果没有就说明并没有安装成功
2.使用
1.这时候在tutorial下面已经可以执行scrapy crawl dmoz已经可以开始抓取了会看到抓取的信息。
3.其他
在sprider文件夹下面有一个dmoz_spider.py文件,这里主要是使用了里面的一些方法,如果要针对自己的网站进行采集需要在这里修改或者新建.
name = "dmoz"
allowed_domains = ["dmoz.org","163.com"] '''
start_urls = [
"http://news.163.com/"
]
我这里要采集的是163的新闻,这里只是做一个演示,如果要用他们家新闻可能需要沟通版权方面的问题。 这个allowed_domains是要采集的域名,如果这里没有写在后面的采集过程中会有错误出现。要采集163的新闻需要自己去解析。主要的是在def parse(self, response)这个方法里面。我这里这个方法如下:
item = ArticleItem()
soup =BeautifulSoup(response.body,"lxml")
tag = soup.title
item["title"] = tag.get_text()
item["link"] = response.url
if(len(soup.select(".otitle"))>0):
item["summary"] = soup.select(".otitle")[0].get_text()
else:
item["summary"] = 'A'
c=''
for i in soup.select(".post_text > p"):
c = c+i.get_text()#把每一段都拼接在一起
item["content"]=self.filterHtmlTag(c)
a_list = soup.select("li > a")
pattern = re.compile(r'(.+?)html$')
url=[]
url.append([i.get("href") for i in a_list if pattern.match(i.get("href"))])
print url
yield item
for src in url[0]:
try:
#yield Request(src,dont_filter=True,meta={'item':item},callback=self.parse_item)
Request=scrapy.Request(src,callback=self.parse_item)
yield Request
log.msg('================================ %s has return request===================================' % src, log.WARNING)
except Exception, e:
log.msg('================================error %s===================================' % e, log.WARNING)
Scrapy 自带有解析的,我这里使用的是第三方的库 BeautifulSoup 在之前的文章里已经说过这个东西这段代码主要是解析获取的页面。如果只是要获取某一个页面直接解析就可以了,我这里是获取了页面之后如果还有新闻链接还要再进去抓取也就是如下这一段
for src in url[0]:
log.msg('================================src %s===================================' % src, log.WARNING)
try:
#yield Request(src,dont_filter=True,meta={'item':item},callback=self.parse_item)
Request=scrapy.Request(src,callback=self.parse_item)
yield Request
log.msg('================================ %s has return request===================================' % src, log.WARNING)
except Exception, e:
log.msg('================================error %s===================================' % e, log.WARNING)
这个时候基本已经可以抓取到文章了,默认会显示在终端抓取的东西,如果是要保存到数据库怎么做 在这里需要用到管道了 默认在目录下面有一个pipelines.py 这个文件 如果是想要保存到数据库或者其他什么地方可以在这里去操作 我这里是保存到mysql 我的操作类如下
#coding=utf-8
import MySQLdb
import os, sys
class mysql_util():
conn=''
cursor = ''
def __init__(self, host='xxx.mysql.rds.aliyuncs.com', user='train', password='Wxkj1234', db='train_main', charset='utf8'):
try:
self.conn = MySQLdb.connect(host, user, password, db)
self.cursor = self.conn.cursor()
dir(self.cursor)
self.conn.set_character_set(charset)
self.cursor.execute('SET CHARACTER SET utf8;')
self.cursor.execute('SET character_set_connection=utf8;')
except Exception, e:
print e
#查询数据
def query(self, sqlStr):
result=''
try:
self.cursor.execute(sqlStr)
result=self.getAllData()
self.conn.commit()
except:
self.conn.rollback()
return result
#获取所有的数据
def getAllData(self):
return self.cursor.fetchall()
#获取单个数据
def getSingleData(self):
return self.cursor.fetchone();
#更新或者插入
def executeSql(self,sql):
try:
self.cursor.execute(sql) self.conn.commit()
except Exception, e:
print e
self.conn.rollback()
在TutorialPipeline里面主要是做一些持久化的功能,我这里在保存数据的同时 还将图片上传到OSS。代码如下
def process_item(self, item, spider):
self.insert(item)
return item def insert(self,item):
u = mysql_util.mysql_util();
if(item["title"]==None or item["title"]== ''):
pass
sql_single = " select id,img_url from scrapy where title='{0}' limit 1".format(item["title"])
row = u.query(sql_single)if(row==None or len(row)==0):
sql="insert into a_scrapy (scrapy_title,scrapy_content,scrapy_link,scrapy_create_on,scrapy_summary,scrapy_is_auth,scrapy_img_src,scrapy_create_timestamp) values('{0}','{1}','{2}',now(),'{3}',1,'{4}',unix_timestamp(now()))".format(item["title"],item["content"],item["link"],item["summary"],item["imageurl"])
#print sql
u.executeSql(sql)
else:
id=row[0][0]
img_url=row[0][1]
if(item["imageurl"]!=''):
if(img_url==''):
sql_update = "update a_scrapy set scrapy_img_src='{0}' where scrapy_id={1}".format(item["imageurl"],id)
u.executeSql(sql_update)
else:
sql_insert = "insert into a_scrapy_imgs (scrapy_id,img_url,is_auth,create_on) values({0},'{1}',1,now())".format(id,item["imageurl"])
print sql_insert
u.executeSql(sql_insert)
上面就是将采集到的新闻存放到mysql里面,那么问题来了如果我要保存图片怎么办,这个时候要使用Scrapy自带的图片下载这块东西了,当然也可以自己去实现他,因为默认他是保存到本地,如果要保存到OSS或者其他CDN之类的还需要自己操作。新建一个DownloadImagesPipeline。主要方法如下:
def file_path(self,request,response=None,info=None):
try:
item=request.meta['item'] #通过上面的meta传递过来item
index=request.meta['index'] #通过上面的index传递过来列表中当前下载图片的下标
log.msg('================================the imgae name %s ===================================' % item['imageurl'], log.WARNING)
#得到图片后缀jpg,png
ISOTIMEFORMAT='%Y-%m-%d'
ext = 'jpg'
if(request.url==None):
ext='jpg'
else:
ext= request.url.split('/')[-1].split('.')[-1]
image_guid = str(random.randint(1,999))+str(time.time()).split('.')[0]+'.'+ ext
log.msg('================================the image_guid %s ===================================' % image_guid, log.WARNING) filename = u'full/{0}/{1}'.format(time.strftime(ISOTIMEFORMAT, time.localtime() ), image_guid)if(len(item['imageurl'])>0):
for url in item['imageurl']:
if len(url)>10:
r= requests.get(str(url))
if(r):
auth = oss2.Auth('QRZM3PraYksFTHkA', 'E03FsWiAXuDSSYuqyGnOuqUK8UUSUO')
bucket = oss2.Bucket(auth, 'oss-cn-hangzhou.aliyuncs.com', 'lvtudiandian')
result = bucket.put_object("news_upload/{0}".format(filename),r)
item['imageurl'] = "news_upload/{0}".format(filename)
else:
item['imageurl'] = ''
return filename
except Exception, e:
log.msg(e)
我这里是直接上传的网络图片 也就是
filename = u'full/{0}/{1}'.format(time.strftime(ISOTIMEFORMAT, time.localtime() ), image_guid)if(len(item['imageurl'])>0):
for url in item['imageurl']:
if len(url)>10:
r= requests.get(str(url))
if(r):
auth = oss2.Auth('QRZM3PraYksFTHkA', 'E03FsWiAXuDSSYuqyGnOuqUK8UUSUO')
bucket = oss2.Bucket(auth, 'oss-cn-hangzhou.aliyuncs.com', 'lvtudiandian')
result = bucket.put_object("news_upload/{0}".format(filename),r)
item['imageurl'] = "news_upload/{0}".format(filename)
原来采用的方法是在下载到本地之后再打开本地图片往上传,出现一个问题,很多时候图片已经存在可是就是找不到这个图片,所以后面改成了直接把图片链接拿过来取了文件流直接上传了。 到这里就结束了,这里只是作为一个例子如果需要用在生产环境中还需要去修改下代码,比如放到系统任务里自动去抓取这个。有什么问题或者建议可以在下面留言。
python Scrapy的更多相关文章
- python scrapy版 极客学院爬虫V2
python scrapy版 极客学院爬虫V2 1 基本技术 使用scrapy 2 这个爬虫的难点是 Request中的headers和cookies 尝试过好多次才成功(模拟登录),否则只能抓免费课 ...
- python Scrapy安装和介绍
python Scrapy安装和介绍 Windows7下安装1.执行easy_install Scrapy Centos6.5下安装 1.库文件安装yum install libxslt-devel ...
- Python.Scrapy.14-scrapy-source-code-analysis-part-4
Scrapy 源代码分析系列-4 scrapy.commands 子包 子包scrapy.commands定义了在命令scrapy中使用的子命令(subcommand): bench, check, ...
- Python.Scrapy.11-scrapy-source-code-analysis-part-1
Scrapy 源代码分析系列-1 spider, spidermanager, crawler, cmdline, command 分析的源代码版本是0.24.6, url: https://gith ...
- python scrapy cannot import name xmlrpc_client的解决方案,解决办法
安装scrapy的时候遇到如下错误的解决办法: "python scrapy cannot import name xmlrpc_client" 先执行 sudo pip unin ...
- 教程+资源,python scrapy实战爬取知乎最性感妹子的爆照合集(12G)!
一.出发点: 之前在知乎看到一位大牛(二胖)写的一篇文章:python爬取知乎最受欢迎的妹子(大概题目是这个,具体记不清了),但是这位二胖哥没有给出源码,而我也没用过python,正好顺便学一学,所以 ...
- 天气提醒邮件服务器(python + scrapy + yagmail)
天气提醒邮件服务器(python + scrapy + yagmail) 项目地址: https://gitee.com/jerry323/weatherReporter 前段时间因为xxx上班有时候 ...
- Python -- Scrapy 框架简单介绍(Scrapy 安装及项目创建)
Python -- Scrapy 框架简单介绍 最近在学习python 爬虫,先后了解学习urllib.urllib2.requests等,后来发现爬虫也有很多框架,而推荐学习最多就是Scrapy框架 ...
- python scrapy,beautifulsoup,regex,sgmparser,request,connection
In [2]: import requests In [3]: s = requests.Session() In [4]: s.headers 如果你是爬虫相关的业务?抓取的网站还各种各样, ...
- 2019-03-22 Python Scrapy 入门教程 笔记
Python Scrapy 入门教程 入门教程笔记: # 创建mySpider scrapy startproject mySpider # 创建itcast.py cd C:\Users\theDa ...
随机推荐
- (转)selenuim-webdriver注解之@FindBy、@FindBys、@FindAll的区别
selenium-webdriver中获取页面元素的方式有很多,使用注解获取页面元素是其中一种途径, 方式有3种:@FindBy.@FindBys.@FindAll.下文对3中类型的区别和使用场景进行 ...
- java基于socket公共聊天室的实现
项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...
- Java程序员必须熟知的十项技术
1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...
- runtime 运行机制2
Mike_zh QQ:82643885 end: blogTitle 博客的标题和副标题 博客园 首页 新随笔 联系 订阅 <a id="MyLinks1_XMLLink" ...
- Rancher 快速上手指南操作(1)
Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...
- 基于现有数据库的Code First模式迁移更新数据库
本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下 ...
- R in a nutshell(连载)
data(cars)dim(cars)names(cars)summary(cars)plot(cars, xlab = "Speed (mph)", ylab = "S ...
- win7下Arduino Mega 2560驱动安装失败解决办法
因为玩四轴用的apm的飞控板,而其需要安装此驱动,曾经在win8使用其,但是因为win8有相对应的数字证书保护措施(应该是这样的,因为好久了记不清楚了),以至于我每次都需要长按shift重启电脑关闭此 ...
- beanstalkd----安装启动
1. 安装This is beanstalkd, a fast, general-purpose work queue.See http://kr.github.io/beanstalkd/ for ...
- Nessus导入Cookie进行Web应用安全扫描
在不导入Cookie使用Nessus进行扫描的时候,扫描的结果是比较简单的,很多深层的问题无法被扫描出来. 需要我们手动导入Cookie,带着Cookie的状态扫描的结果会更详细更深入,以下是操作步骤 ...