公告
周五BI飞起来,每周一个主题,一场跟数据有关的行业、工具、技术的交流盛宴,锁定在每周五晚20:30,不见不散!
2016年06月03日 Friday BI Fly微信直播主题–Python爬虫技术介绍和应用实例
预告一下未来几期的微信直播活动分享主题将包括从产品角度学Excel、谈谈BI在生产企业的应用、大数据职位,数据场技能、数据科学家应用 、SPSS数据挖掘、腾讯大数据分析与挖掘应用、R语言实战、数据挖掘经典案例赏析等,具体日期安排请关注天善智能问答社区活动版块https://www.hellobi.com/events
主持人:加入本群的同学们,感谢大家参加由天善智能举办的 Friday BI Fly 活动,每周五微信直播,每周一个话题敬请关注。
【群规】本群为商业智能和大数据行业、技术、工具的交流学习群。不准发广告,只能发红包,发广告者一律移除微信群。
本次微信直播讨论内容
1.Python爬虫技术简介
2.天善论坛数据为例,介绍具体应用
3.在品牌零售商的应用思考
4.问题解答
本期嘉宾介绍
seng 天善智能社区专家 15年BIDW工作经验
本周微信直播(Python爬虫技术介绍)准备 https://ask.hellobi.com/blog/seng/4020
seng专栏:从事BI、大数据、数据分析工作 https://ask.hellobi.com/blog/seng
主持人:大家好,我是微信直播活动的主持人咖啡,每周一个主题,一场跟数据有关的行业、工具、技术的交流盛宴。我们的口号是“Friday BI Fly 周五BI飞起来”。
前面我们请人民日报大数据专家牟瑞老师给大家做过一期有关python的分享,反响非常强烈,大家还记得那句“人生苦短,我用python”吗,应大家要求,python分享再次给到大家,今天给大家带来分享的是 天善智能社区专家,seng总,他将会以天善智能社区数据为案例,详细讲解python的使用,还会从他擅长的零售行业做些思考,下面我们就有请seng总来给大家带来下面的分享,有请!
Python爬虫技术介绍和应用实例
大家好,我是seng, 主要做的是BI、大数据、数据分析工作。近期我的博客主要是关于Python爬虫相关内容,大家可以去看一下,https://ask.hellobi.com/people/blogs/seng。今天主要讲Python如何编写爬虫,主要是技术方面的内容,内容包括基本Python爬虫基本技术,和Scrpay框架的介绍。
首先来先说一下Python的环境准备
Python环境准备
使用pyenv安装Python的不同版本,使用pyenv-virtualenv隔离不同的环境
我使用的环境是Python 3.5.1,在centOS 6.5/7.1系统上,不过Scrapy1.1版本才支持Python 3,大家要注意下。
安装过程如下:
1、 安装配置pyenv到具体目录,本次安装都是用/pythontestt
2、 pyenv安装具体python版本
3、 安装pyenv-virtualenv
具体的安装可以参照我这个博客<Ubuntu、CentOS下安装pyenv、IPython( Notebook)和科学计算包的过程总结>https://ask.hellobi.com/blog/seng/3084
再来看一下爬虫的基本介绍,我这里主要介绍是定向的爬虫,如获取天善论坛里的所有问题等等。
爬虫基本介绍
爬虫应用的通用步骤
1、 了解需要访问的网站的结构,入口是哪个url,指向那些....
2、 从URL获取对应的HTML代码
3、 解析HTML代码获取想要的信息
4、 保存获取的信息
5、 访问其他页面重复以上过程
对应的使用方法:使用urlopen打开网页,使用BeautifulSoup解析网页,导出数据。
示例:
from urllib.request import urlopen
from bs4 import BeautifulSoup
def getTitle(url):
html = urlopen(url)
bsObj = BeautifulSoup(html.read())
title = bsObj.body.h1
return title
print(getTitle(
"http://www.pythonscraping.com/exercises/exercise1.html"))
读取数据后,还有许多工作,如清洗脏数据、自然语言读写、提交表单和cookie、抓取JavaScript页面、图像处理和文字识别、避免爬虫的抓取,更多相关内容,可以参考《Python网络数据采集》和我的相关博客。
接下来是今天的主要内容,如何使用Scrapy框架
scrapy介绍
Scrapy提供一个爬虫框架,简化了一些操作如异常处理、自动重试啊、输出等等
先给出一个简单示例, 抓取天气预报网站的天气信息
代码如下:
cat getWeatherForcast.py
import scrapy
class GetweatherforcastSpider(scrapy.Spider):
name =
"getWeatherForcast"
allowed_domains = [
"weather.com.cn"]
start_urls = (
'http://www.weather.com.cn/weather/101010100.shtml',
)
def parse(self, response):
print(
'start scraper level1')
for forcasthtml in response.xpath('//ul[@class="t clearfix"]/li'):
print(forcasthtml.xpath(
'h1/text()').extract_first(),forcasthtml.xpath('p[@class="wea"]/text()').extract_first())
print(forcasthtml.xpath(
'p[@class="tem"]/span/text()').extract_first(),forcasthtml.xpath('p[@class="tem"]/i/text()').extract_first())
使用scrapy runspider getWeatherForcast.py --loglevel ERROR
注意,这里使用了Scrapy的最基本的spider类,这里的操作就和我们使用urlopen、BeautifulSoup差不多,里面使用xpath的解析方式。
XPath语法简介:
selenium也支持XPath的定位方式(BeautifulSoup不支持)
XPath的一些语法比较有用,也列了一下:
:根节点和非根节点
—/div 根上的div节点
—//div 所有div节点
:定位属性
—//@href 所有href属性
—//a[@href='https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com/https://ask.hellobi.com'] 所有href指向天善的属性
:按位置选择
—//a[3] 第3个节点
—//table[last()] 最后的表格
—//a[position() < 3] 前3个表格
:通配符 (*)
—//table/tr/* 所有表格的所有内容
—//div[@*] div tag的所有属性
结果如下:
前面先说了一个基本的介绍,接下来说一下Scrapy的安装
Scrapy安装
准备:
pip
install Scrapy
scrapy startproject weatherforcast
scrapy genspider getWeatherForcast weather.com.cn
会生成类似如下的文件结构
其中items.py是返回属性列的定义,pipelines.py主要用于数据的输出,setting.py用于属性设置。
具体的spider在spiders目录下,这是item.py的一个示例
import scrapy
class TianshanquestionItem(scrapy.Item):
# define the fields for your item here like:
domain_id = scrapy.Field()
username = scrapy.Field()
description = scrapy.Field()
pass
读取网页信息
从天善论坛读取 帖子的基本信息
我们拿Scrapy官网的一个示例来说一下callbak函数和yield的特性
callback:定义一个解析函数,上面的示例就定义了遇见/catalog下的href连接,调用parse_title函数解析,可以使用多个callback函数,Scrapy框架会将yield对应的调用放到队列里面,普通的Python脚本会顺序执行, Scrapy框架使用了yield实现了异步调用,还有一个yield的应用,就是这句
这是一个返回值, Scrapy 会把这个数据放到items.py定义的对应内容里面。
使用Scrapy解析的数据导出可以使用以下2种方式
1。使用-o的命令函参数
scrapy crawl getTianshan -o getTianshan.csv -t csv --nolog
2.设置pipline, 修改输出方式
首先需要修改 settting.py 打这个参数打开
ITEM_PIPELINES = {
'createstiemap.pipelines.CreatestiemapPipeline': 300,
}
然后可以修改pipeline.py
这是一个写入mangodb的例子
Scapy会把items.py定义的格式写入mangodb。
接下来 我会介绍一下 crawl的例子,这部分我觉得是Scrapy最好用的东西, 通过规则对应就能很轻松地把数据拿过来。
天善现在的入口是http://ask.hellobi.com/
问题和问题目录都在https://ask.hellobi.com/question/下
区别是https://ask.hellobi.com/question/sort_开始的是目录
按原来的做法,就需要模拟一页一页翻页, 但是CrawlSpider已经遍历的页面,只需要定义规则就可以了。
通过这段代码 就可以把所有问题列表拿出来了
核心就在规则的对应
rules = (
Rule(LinkExtractor(allow=('category/',)), callback='parse_debug', follow=True),
Rule(LinkExtractor(allow=('question/sort_type*', )),callback='parse_debug',follow=True),
Rule(LinkExtractor(allow=('question/\d+', )), callback='parse_item'),
)
category/
question/sort_type* 里面的url继续遍历, 遇见question/19535这种格式的就是问题列表了,解析就可以了。使用scrapy crawl getTianshan -o getTianshan.csv -t csv --nolog 就可以把所有问题拿到了。
上面的示例就说完了。关于Scrapy的更多内容,可以看官网 http://scrapy.org/doc/,建议看pdf格式的, 我觉得和网页格式的优点区别,例子更多一点。
最后我把《Python网络数据采集》读后总结 --第12章避免爬虫的抓取陷阱里面的内容 摘录了一部分。
避免爬虫的抓取陷阱检查清单:
1.检查页面是否由javascript生成
2.检查提交的表单是否包含所有应该提交的字段,包括隐含字段
可以使用Chrome’s Networkinspector 去检查
3.如果某些站点,session保持不住,注意cookie
4.如果经常遇到HTTP错误,特别是403 Forbiddenerrors,可能Ip被封了
首先换一个IP,谈后为了避免再次block,确认
a.不要太快的访问
b.修改你的headers
c.不要去触发Honeypots
其中部分Scrapy已经帮我们处理了一部分, 如headers,访问的频率等,不过还有很多网站对爬虫做了屏蔽,需要更多探索了。
今天我的分享结束了。 感谢大家关注。
自由讨论
1、 请教下,有的网页数据用js脚本返回的,页面源码没有数据怎么抓?
rong :selenium + phantomjs,可以看看我这个博客 《Python网络数据采集》读后总结 --第10章抓取JavaScript生成的页面https://ask.hellobi.com/blog/seng/3847
2、 抓取时出现urlopen error no hostgiven问题
rong:这个需要具体情况具体分析了, 你能用浏览器打开吗, head有没有设置
早上好啊:我设置了代理池和agent,能打开,得到json字符串,单独测试一个链接是可以的,但是从文件读取链接开始抓取就会出错
hi,I'm frank:如果能打开我建议用requests
早上好啊:是用的request
hi,I'm frank:如果requests还有问题,建议带上请求头
早上好啊:我试试
3、 为什么会需要同时安装不同版本 Python
Rong:有些包需要不同的python版本
4、 爬虫的第一步.网络的结构具体指什么
Rong:就是你访问网页的路径
5、 beatifulsoup 和scrary 框架下spider一样功能?
Rong:beatifulsoup是解析网页的包,scrary是爬虫 框架
6、 安装生成和文件结构生成不太明白,看什么内容能填充空白?
Rong:这个看官方文档就好了。
7、 数据分析的前提不是爬虫吗?不然数据源从哪里来?
Rong:爬虫可以获取一部分数据源,不过如果网站能够提供api访问,还是走正规路径。
8、 爬到的数据量太大的时候 数据分析有什么好建议?遇到加密数据怎么破? 来自广州站的问题
Rong:数据分析和爬虫无关,主要在于你想做什么。你都放到 mango里面再处理就可以了。遇到加密数据怎么破? 要看具体怎么加密了, 特殊的不说,一般的网页还是要给人看懂的。
9、 请问老师,python开发的爬虫脚本相比与其它语言的优势是什么?比如我一直在用C#开发
Rong:package比较多,Scrapy我觉得就比较强大,少数代码就搞定了
10、 hy88的分类翻页list里,模拟翻页时,server会随机插入之前的page,如何破@seng 来自广州群的提问
hi,I'm frank:什么叫插入前面的页?
古宇:比如我按规则已经抓到35页,模拟点击36页的话,该页内容实际上是前面爬过的第1页,上次我爬了1000页才发现被耍了,而且server还不是给的完全的第1页,里面还有内容的随机修改。
11、 1000线程同时爬怎么做,识别验证码的插件有推荐的么?爬完页面,释放页面内存怎么做?
轩:可以用greenlet专门做IO密集的多线程。。。
Roy:之前开了1000个线程,一个页面100K,直接把服务器带宽跑暴了,有什么好的解决办法么?
赵领杰:Python的多线程是不是鸡肋呢?它是不是实际上还是多进程在跑
Rong:@Roy这个Scrapy框架会处理掉的, 我觉得还是用框架好。
12、 请问一下,对于百度指数这种数字由css图形拼接的情况有方法处理吗?
Rong: 这个要分析图形码, 这个比较难。 如果够标准 还是有ocr软件的
13、 被服务器屏蔽IP有什么好的办法么?可以虚拟IP地址么
赵领杰 :可以用代理解决屏蔽ip问题
Rong:一个是代理,上次牟瑞提了一个adsl 我觉得也不错, 不过不知道现在还有吗?
Roy:adsl是什么?代理很难找啊
昂 yao :以前屏蔽ip,我用的是代理
昂 yao:找几千个代理,多线程上
赵领杰:@Roy Google随便找
Roy:不是吧,很多代理都连不上啊
昂 yao:有些免费代理的网站
Roy:有没有直接修改IP地址的办法?
晟嘉:当爬取的是海量数据时,切换代理的时间也是不可忽视的成本。
Roy:修改TCP协议
昂 yao:连不上就自动结束线程
赵领杰:可以修改自己代码逻辑吧
昂 yao:嗯,切换代理确实费时间,但多线程就没事了
晟嘉:而且爬虫要求的硬件规模很高,这都是现在技术的瓶颈
昂 yao:以前试过也可行。就是会有很多垃圾线程
Roy:最主要的是带宽吧,带宽是最大瓶颈
昂 yao:现在100兆宽带不贵
晟嘉:可用线程数 可用IP数
晟嘉:原来爬淘宝交易记录,没有个百万的投资根本玩不转
14、 线程太多,65535个端口用完了,来不及释放,直接就报错,怎么办
Roy:有人有好的办法么
赵领杰:没有……
轩: vlan隔离呢?隔离成不同的子网,爬出来交给potal机汇总处理
晟嘉:厉害
Roy :都是高手,谁能帮忙写个爬虫,10000个线程同时提交请求
Miao:根据以往写爬虫经验,超过50w条数据基本能碰到上面提到的大多数问题。
主持人:
时间关系,不得不结束今天的分享了,再次感谢seng的精彩分享以及耐心细致的回答,如果大家对python方面还有什么疑问或不解,甚至是零售行业,大数据以及BIEE方面的问题,都可以提问到社区https://ask.hellobi.com/question, seng总定会详细解答。今天的微信直播活动文字版记录会发布到http://ask.hellobi.com/blog/tianshansoft/category/354 和公众号里面。
预告
预告下未来几个月的微信直播主题
从产品角度学Excel、谈谈BI在生产企业的应用、大数据职位,数据场技能、数据科学家应用、SPSS数据挖掘、腾讯大数据分析与挖掘应用、R语言实战、数据挖掘经典案例赏析等相关的主题分享。
友情提醒
下周五刚好是端午节,微信直播活动暂停一周,大家好好去玩吧!
今天的微信直播活动到这里就结束了,喜欢天善智能的朋友们请继续关注我们,每周五晚8:30,我们不见不散哦!
参与方式
每周 Friday BI Fly 微信直播参加方式,加个人微信:liangyonghellobi ,并发送微信:行业+姓名,即可参加天善智能微信直播活动。
天善智能介绍
天善智能是一个专注于商业智能BI、数据分析、数据挖掘和大数据技术的垂直社区平台,旗下包括问答社区、在线学院和招聘平台三个网站。
问答社区和在线学院是国内最大的商业智能BI 和大数据领域的技术社区和在线学习平台,技术版块与在线课程已经覆盖 商业智能、数据分析、数据挖掘、大数据、数据仓库、Microsoft BI、Oracle BIEE、IBM Cognos、SAP BO、Kettle、Informatica、DataStage、Halo BI、QlikView、Tableau、Hadoop 等国外主流产品和技术。
天善智能积极地推动国产商业智能 BI 和大数据产品与技术在国内的普及与发展,合作成员包括:帆软软件、Smartbi、永洪科技、ETHINKBI、TASKCTL、奥威Power-BI、上海启路科技、上海亦策等。