爬⾍随笔(1):Spyder(Python2.7)环境搭建爬⾍初体(ru)验(keng)⼀、前⾔
今天说起⼤数据已经不陌⽣了,⽽做⼤数据分析的第⼀步就是拿到⼤量的数据。⼀般企业⾃⼰积累的数据不会很多,也不⼀定有价值。所以,万维⽹作为⼤量信息的载体,⾃然成了⼀个理想渠道。关于⽹络爬⾍,百度百科的介绍是这样的:
⽹络爬⾍(⼜被称为⽹页蜘蛛,⽹络机器⼈,在FOAF社区中间,更经常的称为⽹页追逐者),是⼀种按照⼀定的规则,⾃动地抓取万维⽹信息的程序或者脚本。另外⼀些不常使⽤的名字还有蚂蚁、⾃动索引、模拟程序或者蠕⾍。 ——引⽤⾃百度百科
说来也巧,百度本⾝就是爬⾍起家的公司,⽽它的前辈就是赫赫有名的⾕歌搜索引擎。⾕歌的创始⼈可以说是第⼀个做到数据赚钱的⼈了。笔者也是个本科在读⼩⽩,这个⽉偶然参与到⼀个训练营,写些记录。
⼆、爬⾍环境搭建
⾸先,我们选取Anaconda来开启爬⾍之旅,为什么呢?
因为Anaconda是⼀个开源的Python发⾏版本,包含180多个科学包及其依赖项。
Python本⾝是⼀门严重依赖依赖的语⾔,如果你在学习之初没有很好的规划,后⾯可能会有点乱(版本、包)。
笔者是这样的:前期安装Anaconda2.7版本,各种环境和包配置在其⾃带的Python27上,后⾯转⽤pycharm可以选择继续使⽤这套环境,只要导⼊就⾏了。
好的,那么⾸先是Anaconda的安装。
###安装Anaconda
⾸先,根据系统情况下载对应的anaconda:
Python2.7下载anaconda2-5.0以上版本
接下来安装过程中,注意以下⼏点:
Advanced Options中两项都要勾选,将anaconda加⼊到系统环境变量中,并把当前anaconda作为系统默认Python环境。
跳过vscode的安装
安装完成后,在Windows的窗⼝中搜索anaconda,打开anaconda navigator,进⼊anaconda
如果打开导航后⽆法进⼊anaconda界⾯,则检查电脑中是否安装visual c++ redistributable;如果未安装,需安装visual c++ Redistributable。
Visual Redistributable c++ 2015
接下来,只要进⼊anaconda navigator后点击启动Spyder就可以开始编程啦。
还有⼀步设置anaconda国内镜像的,在CMD执⾏
# 添加Anaconda的TUNA镜像
conda config --add channels mirrors.tuna.tsinghua.edu/anaconda/pkgs/free/
# 设置搜索时显⽰通道地址
conda config --set show_channel_urls yes
###安装爬⾍需要的包
在命令⾏窗⼝执⾏:
> pip install requests
> pip install scrapy
> pip install beautifulsoup
三、实现访问⽹站
⼤多数⼈有这样⼀条必由之路:某天突然踏⼊爬⾍的领域,没有学院式的指导,你开始试着⽤Resquests库勉强开发了⼀个能跑得动的爬⾍:访问⽹站,下载源码,挣扎在BeautifulSoup中,提取数据,拙劣的反爬⼿段……第⼀次写的程序跑起来很慢,也有很多细节没处理好,于是你让它整夜地跑,最终⼤部分数据拿到⼿了。⽽下⼀次,当你对爬⾍的⼯作流程⾮常熟练了,你会直奔Scrapy——优雅的框架,这是后话了。
如果没接触过前端开发,那你可能要去补⼀下知识。我也没系统接触过前端Web,但对于⽹络连接的基础知识还是能理解。事实上爬⾍也就是⽤机器模拟⼈的⾏为去访问⽹站⽽已,⽽我们编写程序需要做的也就是根据Web编写的规律去有效的抓取我们需要的东西。所以我们⾄少要知道访问⽹站的时候发⽣了什么。
###request和response
在CSDN上已经有了介绍。当web服务器收到客户端的http请求,会针对每⼀次请求,分别创建⼀个⽤于代表请求的request对象、和代表响应的response对象。也许说到这⾥还是有点迷,那我们先来看⼀下代码。
###requests模块
说明⼀下,我使⽤的是python2.7。⾸先安装好requests这个模块:CMD下pip install requests。接下来,我们随便选择⼀个⽹站来抓取咨询,我这⾥⽤的是
安装完requests包后,我们先看⼀下源码,了解⼀下这个模块
"""
Requests HTTP Library
~~~~~~~~~~~~~~~~~~~~~
Requests is an HTTP library, written in Python, for human beings. Basic GET
usage:
>>> import requests
>>> r = ('')
>>> r.status_code
200
>>> 'Python is a programming language' t
True
... or POST:
>>> payload = dict(key1='value1', key2='value2')
>>> r = requests.post('/post', data=payload)
>>> )
{
.
..
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
"""
这⾥告诉我们,这个包是⼀个HTTP Library,我们可以⽤它来连接某个⽹站的url进⽽获取数据。并且给出了使⽤⽅法,所以我么你可以很简单写出:
# -*- coding: utf-8 -*-
import requests
('www.csdn')
简单的⼀⾏代码,如果你在命令⾏输⼊req查看这个req的内容,你会得到<Response [200]> ,通过上⾯关于response的⽂章的介绍,我们知道了[200]这个状态码代表:“请求成功处理”。⽽返回的这个response对象中就包含了本次⽹络连接的所有信息,具体可
以req.+Tab查看。例如输⼊t 就会输出该页⾯的全部源代码。
四、解析源码、获取内容
前⾯我们已经把整个页⾯的源码都拿下来,那么接下来我么你需要解析⼀下这个源码,寻我们想要的内容对应的web标签在哪个地⽅。⾸先页⾯的内容分为HTML ,JavaScript,CSS,⾸先我们先⽤DOM树解析法把源码根据标签来划分树,接下来观察前端开发编码的规则来进⾏定位。
⾸先我们需要说明⼀下⽹页的源码、标签分别是什么。打开⼀个浏览器(以⾕歌浏览器为例),按下F12键便可以查看⽹页源码;右键点击⽹页上任意版块并选择检查,源码中对应的代码块就会⾼亮显⽰。每个标签的属性有:id、class、text、interhtml
观察源码不难看出,源码中存在很多的<div></div>、<p></p>、<a></a> ,分别是万能标签、段落标签、超链接。移动⿏标停在不同的代码段上,就能看出其规律。
根据前⾯的思路,我们现在来解析这个源码。⾸先需要安装⼀个包pip install BeautifulSoup ,接下来⼀样的查看BeautifulSoup这个包的源码+说明⽂档。
国内源代码网站Beautiful Soup uses a pluggable XML or HTML parser to parse a (possibly invalid) document into a tree representation.
Beautiful Soup provides methods and Pythonic idioms that make it easy to navigate,search, and modify the parse tree.
可以知道,这个包的功能就是使⽤解析器来解析⽂档到树结构中。根据说明⽂档我们可以写出如下代码来建⽴这个解析树:
from bs4 import BeautifulSoup
bs=t,'html.parser')
依旧是简单的⼀⾏代码,就将这个树建⽴好了,接下来我们可以⽤这个包的⽅法从树上根据我们需要的标签特点来定位到相关的代码块。
###定位所需内容的标签
还是上⾯那张⽹页源码的截图,可以发现每⼀条<li> class=...>...</li> 就对应着⼀条标题内容。我们点击每⼀个标题检查源码的时候会发现他们有共同的部分,也就是下⾯这张图
对⽐其它标题你会发现,每⼀个li 标签中<h2 class=...></h2> 之外的结构和内容基本是⼀样的,也就是说每个标题的信息就包含在这个代码块中。发现了这个规律后,我们只要通过这个标签的属性把所有h2 标签的代码块都从树上拿出来,就可以来获取标题的内容了。
h2_title=bs.find_all('h2',attrs={'class':'csdn-tracking-statistics'})
此时你输出h2_title时,则会显⽰到相应的代码块了。但是到这⼀步你还是⽆法获取到标题的⽂字内容。想⼀下,如果你平时⾃⼰操作的话,要怎么做?⼀般都是点击进去,然后把页⾯的标题复制下来。所以同样的道理,我们要进⼊该链接继续解析。
###获取内容
执⾏如下代码,便可以获取到所有标题内容啦,循环体⾥⾯做的事跟上⾯的原理是完全⼀样的。
for info in h2_title:
url=('href') #获取链接
(url) #对该⽹址发出请求连接
bs1=t,'html.parser') #以html解释⽅式建⽴DOM树
title=bs1.find('h1') #寻标题对应的代码块
h1_all=bs1.find_all('h1',attrs={'class':'csdn_top'})
print title #显⽰每⼀个标题
下⾯给出另⼀个⽹页的解析代码和执⾏结果,可以对⽐着看,很容易模仿。
import requests
from bs4 import BeautifulSoup
('finance.eastmoney/news/cywjh.html')
bs=t,'html.parser')
p_title=bs.find_all('p',attrs={'class':'title'})
for info in p_title:
url=('href')
(url)
bs1=t,'html.parser')
title=bs1.find('h1')
p_all=bs1.find_all('p')
print title
下⾯直接分享刚开始学的时候写的⼀个抓取CSDN主页更新⽂章的程序:
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 22 15:34:49 2018
@author: mfw
"""
import requests
import codecs
from bs4 import BeautifulSoup
f = codecs.open('','w','utf-8')
# 这个⽅法⽤来将infomation写⼊⽂件
def showtitle(url):
# 发出请求得到返回对象,如果req.status_code是200,说明访问成功
req = (url)
# 将⽹页的源码以HTML模式建⽴节点树,以便我们在树上寻元素
bs = t,'html.parser')
# find_all()⽅法可以出所有的li标签,因为⽂章的链接等信息就藏在这⾥
li_title = bs.find_all('li',{'class':'blog-unit'})
# 从li标签中获取href即⽂章链接,再发送请求获取⽂章正⽂
for info in li_title:
url = ('href')
req = (url)
bs1 = t,'html.parser')
title = bs1.find('h1')
text = +u'\n'
f.write(text)
# f.close()
return bs
# start
# 研究csdn主页新闻可发现其页⾯URL是由规律的,第⼀页是xxx,第⼆页就是xxx/list/2 # 所以我们可以通过这种⽅式来⽣成⼀系列页⾯的URL序列
URL ='blog.csdn/blogdevteam'
BS = showtitle(URL)
for i in range(2,28):
u ='blog.csdn/blogdevteam/article/list/'+str(i)
b = showtitle(u)
print("The progress of the crawler:"+str(i*100/27)+'%')
print"Done!"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论