python Scrapy安装、教程、及爬虫

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()     #文章正文


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)、代码:

#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'

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

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

      唔。。。至少我是。。。

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

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

from scrapy import cmdline
cmdline.execute("scrapy crawl heart".split())
#启动用于爬取 “39.net” 的spider
      如果还会出现以上错误,可以试着在新窗口打开文件夹试一下。


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


     我要说一句:我好讨厌这一行代码啊啊啊

   

      


你可能感兴趣的:(python)