您的位置:首页 > 编程语言 > Python开发

python Scrapy安装、教程、及爬虫

2016-04-15 17:42 756 查看
1、首先要安装好scrapy模块,讲真,真的要找到一个好的安装教程,你会省很大力 传送门 b( ̄▽ ̄)d

2、Scrapy是一个用python编写的,很轻巧方便的网络爬虫。

简单的理解,它可以爬取某一个网页的所需信息和链接传回并储存,然后本地代码可以继续访问爬取到的链接,并获取所需信息继续传回储存。

这里有比较严谨的解释 http://hao.jobbole.com/python-scrapy/

对于爬虫教程网上也有很多 http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/tutorial.html

3、首先先创建一个爬虫项目,我爬的是这个网址 http://heart.39.net/zhlm/bljd/xzb/
运行 >> cmd >> 切换到存放代码的目录中 >> 执行命令:scrapy startproject heart("heart"为项目名称)

然后它就会在目录生成一些文件,主要为(以下均为我的简单理解,如有不对,请指出O(∩_∩)O谢谢):

<span style="font-size:18px;">
│  scrapy.cfg                #项目的配置文件
│
└─heart
│  items.py              #定义items,就是你想爬的那一类的叫啥(起个名儿),然后你爬下来后它就会存在哪个下面
│  pipelines.py          #管道,即如果想将爬到的东西存到数据库中,可以在这写明,如果存到本地可以不用改
│  settings.py           #放置,即储存的路径,格式
│  __init__.py
│
└─spiders               #放置spider代码的目录,即在它下面创建.py文件来写爬虫代码
__init__.py
</span>


4、定义items

我要在这个网站中获取 文章标题、url(即文章链接)、文章正文



创建一个scrapy.Item类,并用scrapy.Field()的类属性来定义一个item

<span style="font-size:18px;">import scrapy

class HeartItem(scrapy.Item):
title=scrapy.Field()    #文章标题
link=scrapy.Field()     #文章链接
text=scrapy.Field()     #文章正文</span>


5、编写爬虫(spider)
spider是用户编写的类,用于写要抓取的信息的代码,要继承
scrapy.Spider 类,并定义三个属性:

-- name:用于区别每一个spider,名字是唯一的,且不同的spider定义不同的name,叫啥你开心就好!!

-- start_urls:从属性名就可以看出来,这是初始的网址,爬虫从初始网页上爬取这个网页包含的url,然后会继续访问 子url 获取信息。(可以不唯一)

-- parse():spider的一个方法。用于提取原始网页的数据,生成item,并生成用于进一步处理的 子url 数据。

☟☟我觉得以下在小黑框里输入的东西一定要输一遍

(1)、运行cmd,进入项目根目录,输入scrapy crawl heart

(2)、输入 scrapy shell “ http://heart.39.net/zhlm/bljd/xzb/(即初始网址)”
(3)、提取item(使用shell中的selector选择器,然后sel.xpath)

讲一下在xpath中:

以 //div[@class="newslist"]/ul/li/a/@href 和 //title/text()为例吧!

① // 开始要为两个斜杠;

② div [@class="newslist"] 选择类为 class="newslist" 的 div;

③ a/@href 提取url用@href ;

④ //title/text() 提取正文用 text();

⑤ 另外extract() 序列化该节点为uncoide字符串并返回list ;

具体方法可以看下面代码,我不太会表达(或者可以去看教程(*/ω╲*))

(4)、代码:

<span style="font-size:18px;">#coding=utf-8
import scrapy
from scrapy.http import Request
from scrapy.selector import Selector
from heart.items import HeartItem
#从items.py导入item

class heartSpider(scrapy.Spider):
name = "heart"
allowed_domains=["39.net"]  #网址的域名
start_urls=[
'http://heart0.39.net/zhlm/bljd/xzb/',
'http://heart0.39.net/zhlm/bljd/xzb/index_1.html',
'http://heart0.39.net/zhlm/bljd/xzb/index_2.html'
]            #初始网址可以不唯一,如果网址较多且规律,可以使用for循环

def parse(self,response):
selector=Selector(response)
#shell载入存入response,selector在response中提取元素
item=HeartItem()
#导入item
link=selector.xpath('//div[@class="newslist"]/ul/li/a/@href').extract()
#提取原始网页上所需的 子url
for i in range(len(link)):
#获取所获 子url 数
yield scrapy.Request(link[i],callback=self.parseContent,meta={'item':item})
#为子网页做准备,以子url链接下面的访问子网页代码

def parseContent(self,response):
selector=Selector(response)  #载入 子response
item=response.meta['item']   #嗯,item
html=selector.xpath('//div[@class="art_con"]')  #获取要爬取信息的div部分
for sel in html:
item['title']=sel.xpath('//title/text()').extract()  #这是文章标题
item['text']=sel.xpath('p/text()').extract()    #文章正文
#啊啊啊啊,其实就是HTML代码嘛!!!说起来好纠结。。。
item['link']=response.url  #那些 子url。。。
yield item  #最后存入item

spider=heartSpider()</span>


下面是其他的文件内容。

6、pipelines.py 和 settings.py

因为我在储存在本地,所以这里pipelines.py文件不做修改

以下是settings.py

<span style="font-size:18px;">BOT_NAME = 'heart0'    #name
USER_AGENT='Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
FEED_URI=u'file///E:/360Apps/test/Scrapy/heart0/heartache.csv'  #储存路径
FEED_FORMAT='CSV'   #扩展名,即你想要存储成什么格式
SPIDER_MODULES = ['heart0.spiders']
NEWSPIDER_MODULE = 'heart0.spiders'</span>


7、main.py文件(与heart文件夹在同一目录下)

是不是感觉做完以上工作就在IDE上运行会出错啊【欠揍脸 (ˉ▽ ̄~) 切~~】

唔。。。至少我是。。。

错误为:ImportError: No module named heart.items

所以要新建一个main.py文件来“统领全局”,然后要运行这个文件:

<span style="font-size:18px;">from scrapy import cmdline
cmdline.execute("scrapy crawl heart".split())
#启动用于爬取 “39.net” 的spider
</span>
如果还会出现以上错误,可以试着在新窗口打开文件夹试一下。

8、可能有时候用 xpath 爬取的数据不完全,可以试着用其他的抓取方法抓取这部分数据。

我要说一句:我好讨厌这一行代码啊啊啊
<span style="font-size:18px;">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: