大家好,我是seng, 主要做的是BI、大数据、数据分析工作。今天主要讲如何编写爬虫,主要是技术方面的内容,内容包括基本爬虫基本技术,和框架的介绍。
首先来先说一下的环境准备
环境准备
使用pyenv安装的不同版本,使用pyenv-隔离不同的环境
我使用的环境是 3.5.1,在 6.5/7.1系统上,不过.1版本才支持 3,大家要注意下。
安装过程如下:
1、 安装配置pyenv到具体目录,本次安装都是用/
2、 pyenv安装具体版本
3、 安装pyenv-
具体的安装可以参照我这个博客、下安装pyenv、( )和科学计算包的过程总结
再来看一下爬虫的基本介绍java爬虫的步骤 Python爬虫技术介绍和应用实例,我这里主要介绍是定向的爬虫,如获取天善论坛里的所有问题等等。
爬虫基本介绍
爬虫应用的通用步骤
1、 了解需要访问的网站的结构,入口是哪个urljava爬虫的步骤,指向那些....
2、 从URL获取对应的HTML代码
3、 解析HTML代码获取想要的信息
4、 保存获取的信息
5、 访问其他页面重复以上过程
对应的使用方法:使用打开网页,使用解析网页,导出数据。
示例:
Consolas;color:black">fromConsolas;color:#4C4C4C"> urllib.request Consolas;color:black">importConsolas;color:#4C4C4C"> urlopenConsolas;color:#4C4C4C">
fromConsolas;color:#4C4C4C"> bs4 Consolas;color:black">importConsolas;color:#4C4C4C"> BeautifulSoupConsolas;color:#4C4C4C">
defmso-bidi-font-family:Consolas;color:#4C4C4C"> mso-bidi-font-family:Consolas;color:#990000">getTitlemso-bidi-font-family:Consolas;color:#4C4C4C">(url)mso-bidi-font-family:Consolas;color:#4C4C4C">:Consolas;color:#4C4C4C">
<p>
html = urlopen(url)
bsObj = BeautifulSoup(html.read())
title = bsObj.body.h1 mso-bidi-font-family:Consolas;color:black">returnConsolas;color:#4C4C4C"> titlecolor:#4C4C4C">
</p>
读取数据后,还有许多工作,如清洗脏数据、自然语言读写、提交表单和、抓取页面、图像处理和文字识别、避免爬虫的抓取,更多相关内容,可以参考《网络数据采集》和我的相关博客。
接下来是今天的主要内容,如何使用框架
介绍
提供一个爬虫框架,简化了一些操作如异常处理、自动重试啊、输出等等
先给出一个简单示例, 抓取天气预报网站的天气信息
代码如下:
Consolas;color:#4C4C4C">cat getWeatherForcast.pyConsolas;color:#4C4C4C">
# -*- coding: utf-8 -*-Consolas;color:#4C4C4C">
importConsolas;color:#4C4C4C"> scrapycolor:#4C4C4C">
classmso-bidi-font-family:Consolas;color:#445588"> mso-bidi-font-family:Consolas;color:#445588">GetweatherforcastSpidermso-bidi-font-family:Consolas;color:#445588">(scrapy.Spider)mso-bidi-font-family:Consolas;color:#445588">:Consolas;color:#4C4C4C">
name = mso-bidi-font-family:Consolas;color:#DD1144">"getWeatherForcast"Consolas;color:#4C4C4C">
allowed_domains = [mso-bidi-font-family:Consolas;color:#DD1144">"weather.com.cn"Consolas;color:#4C4C4C">]
start_urls = ( mso-bidi-font-family:Consolas;color:#DD1144">'http://www.weather.com.cn/weather/101010100.shtml'Consolas;color:#4C4C4C">,
) mso-bidi-font-family:Consolas;color:black">defmso-bidi-font-family:Consolas;color:#4C4C4C"> mso-bidi-font-family:Consolas;color:#990000">parsemso-bidi-font-family:Consolas;color:#4C4C4C">(self, response)mso-bidi-font-family:Consolas;color:#4C4C4C">:Consolas;color:#4C4C4C">
print(mso-bidi-font-family:Consolas;color:#DD1144">'start scraper level1'Consolas;color:#4C4C4C">)
mso-bidi-font-family:Consolas;color:black">for forcasthtml Consolas;color:black">in response.xpath(Consolas;color:#DD1144">'//ul[@class="t clearfix"]/li'):
print(forcasthtml.xpath(mso-bidi-font-family:Consolas;color:#DD1144">'h1/text()'Consolas;color:#4C4C4C">).extract_first(),forcasthtml.xpath(mso-bidi-font-family:Consolas;color:#DD1144">'p[@class="wea"]/text()'Consolas;color:#4C4C4C">).extract_first())Consolas;color:#4C4C4C">
print(forcasthtml.xpath(mso-bidi-font-family:Consolas;color:#DD1144">'p[@class="tem"]/span/text()'Consolas;color:#4C4C4C">).extract_first(),forcasthtml.xpath(mso-bidi-font-family:Consolas;color:#DD1144">'p[@class="tem"]/i/text()'Consolas;color:#4C4C4C">).extract_first())Consolas;color:#4C4C4C">
使用 .py -- ERROR
注意,这里使用了的最基本的类,这里的操作就和我们使用、差不多,里面使用xpath的解析方式。
XPath语法简介:
也支持XPath的定位方式(不支持)
XPath的一些语法比较有用,也列了一下:
:根节点和非根节点
—/div 根上的div节点
—//div 所有div节点
:定位属性
—//@href 所有href属性
—//a[@href='问题 - 天善智能:'] 所有href指向天善的属性
:按位置选择
—//a[3] 第3个节点
—//table[last()] 最后的表格
—//a[() < 3] 前3个表格
:通配符 (*)
—//table/tr/* 所有表格的所有内容
—//div[@*] div tag的所有属性
结果如下:
前面先说了一个基本的介绍,接下来说一下的安装
安装
color:#4C4C4C">准备:
pip mso-bidi-font-family:Consolas;color:black">installmso-bidi-font-family:Consolas;color:#4C4C4C"> ScrapyConsolas;color:#4C4C4C">
--mso-bidi-font-family:Consolas;color:#999988">生成projectConsolas;color:#4C4C4C">
scrapy startproject weatherforcast
--mso-bidi-font-family:Consolas;color:#999988">生成爬虫Consolas;color:#4C4C4C">
会生成类似如下的文件结构
其中items.py是返回属性列的定义,.py主要用于数据的输出,.py用于属性设置。
具体的在目录下,这是item.py的一个示例
class (.Item):
# the for your item here like:
= .Field()
= .Field()
= .Field()
pass
读取网页信息
从天善论坛读取 帖子的基本信息
我们拿官网的一个示例来说一下函数和yield的特性
:定义一个解析函数,上面的示例就定义了遇见/下的href连接,调用函数解析,可以使用多个函数,框架会将yield对应的调用放到队列里面,普通的脚本会顺序执行, 框架使用了yield实现了异步调用,还有一个yield的应用,就是这句
这是一个返回值, 会把这个数据放到items.py定义的对应内容里面。
使用解析的数据导出可以使用以下2种方式
1。使用-o的命令函参数
crawl -o .csv -t csv --nolog
2.设置,修改输出方式
首先需要修改 .py 打这个参数打开
= {
'..e': 300,
}
然后可以修改.py
这是一个写入的例子
Scapy会把items.py定义的格式写入。
接下来 我会介绍一下 crawl的例子java爬虫的步骤,这部分我觉得是最好用的东西, 通过规则对应就能很轻松地把数据拿过来。
天善现在的入口是问题 - 天善智能:专注于商业智能BI和数据分析、大数据领域的垂直社区平台
问题和问题目录都在//下
区别是//sort_开始的是目录
按原来的做法,就需要模拟一页一页翻页, 但是已经遍历的页面,只需要定义规则就可以了。
通过这段代码 就可以把所有问题列表拿出来了
核心就在规则的对应
rules = (
Rule((allow=('/',)), ='', =True),
Rule((allow=('/*', )),='',=True),
Rule((allow=('/d+', )), =''),
)
/
/* 里面的url继续遍历, 遇见/19535这种格式的就是问题列表了,解析就可以了。使用 crawl -o .csv -t csv --nolog 就可以把所有问题拿到了。
上面的示例就说完了。关于的更多内容,可以看官网 | ,建议看pdf格式的, 我觉得和网页格式的优点区别,例子更多一点。
最后我把《网络数据采集》读后总结 --第12章避免爬虫的抓取陷阱里面的内容 摘录了一部分。
避免爬虫的抓取陷阱检查清单:
1.检查页面是否由生成
2.检查提交的表单是否包含所有应该提交的字段,包括隐含字段
可以使用’s 去检查
3.如果某些站点,保持不住,注意