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谢谢):
│ scrapy.cfg #项目的配置文件
│
└─heart
│ items.py #定义items,就是你想爬的那一类的叫啥(起个名儿),然后你爬下来后它就会存在哪个下面
│ pipelines.py #管道,即如果想将爬到的东西存到数据库中,可以在这写明,如果存到本地可以不用改
│ settings.py #放置,即储存的路径,格式
│ __init__.py
│
└─spiders #放置spider代码的目录,即在它下面创建.py文件来写爬虫代码
__init__.py
4、定义items
我要在这个网站中获取 文章标题、url(即文章链接)、文章正文
创建一个scrapy.Item类,并用scrapy.Field()的类属性来定义一个item
import scrapy
class HeartItem(scrapy.Item):
title=scrapy.Field() #文章标题
link=scrapy.Field() #文章链接
text=scrapy.Field() #文章正文
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)、代码:
#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()
6、pipelines.py 和 settings.py
因为我在储存在本地,所以这里pipelines.py文件不做修改
以下是settings.py
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'
是不是感觉做完以上工作就在IDE上运行会出错啊【欠揍脸 (ˉ▽ ̄~) 切~~】
唔。。。至少我是。。。
错误为:ImportError: No module named heart.items
所以要新建一个main.py文件来“统领全局”,然后要运行这个文件:
from scrapy import cmdline
cmdline.execute("scrapy crawl heart".split())
#启动用于爬取 “39.net” 的spider
如果还会出现以上错误,可以试着在新窗口打开文件夹试一下。
8、可能有时候用 xpath 爬取的数据不完全,可以试着用其他的抓取方法抓取这部分数据。
我要说一句:我好讨厌这一行代码啊啊啊