【Friday BI Fly】2016年06月03日 Python爬虫技术介绍和应用实例 微信直播文字记录 【全程回放】

浏览: 3005

公告

周五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

# -*- coding: utf-8 -*-

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() &lt; 3] 前3个表格
:通配符 (*)
—//table/tr/* 所有表格的所有内容
—//div[@*]  div tag的所有属性

结果如下:


前面先说了一个基本的介绍,接下来说一下Scrapy的安装

Scrapy安装

准备:

pip
install Scrapy

--生成project

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#开发

Rongpackage比较多,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 我觉得也不错, 不过不知道现在还有吗?

Royadsl是什么?代理很难找啊

昂 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、上海启路科技、上海亦策等。

推荐 4
本文由 天善智能 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

喜欢纯技术的

要回复文章请先登录注册