爬虫框架Scrapy的第一个爬虫示例入门教程

Scrapy 框架之初窥探门径

  • 使用Scrapy抓取一个网站一共四个步骤:
  1. 创建一个Scrapy项目
  2. 定义Item容器
  3. 编写爬虫
  4. 存储内容

创建一个Scrapy项目

在cmd命令下输入

C:\Users\Administrator>d:
D:\>cd mypython
D:\mypython>scrapy startproject tur

定义Item容器

Item是保存爬取到的数据的容器,其使用方法和Python的字典类似,并且提供了额外的保护机制避免拼写错误导致的未定义的字段错误。

打开 items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class TutorialItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

编写爬虫

由于dmoz.org无法访问,就用www.chinadmoz.org代替了,正好也是中文方便查找
接下来是编写爬虫类spider,spider是用户编写用于从网站上爬取数据的类。

其包含了一个用于下载的出书URL,然后是如何跟进网页中的链接以及如何分析页面中的内容,还有提取生成item的方法。

在spider文件夹下创建一个dmoz_spider.py的文件
也可以直接在命令指令里面输入

scrapy genspider -t basic dmoz_spider chinadmoz.org

注意:创建的这个dmoz不能与project相同名字

import scrapy

class NewSpider(scrapy.Spider):#继承scrapy.Spider
    name = "dmoz"#唯一名字
    allowed_domain = ['chinadmoz.org']#给设定一个范围
    start_urls = [
            'http://www.chinadmoz.org/subindustry/33/',
            'http://www.chinadmoz.org/subindustry/39/'
                  ]

    def parse(self,response):
        filename = response.url.split("/")[-2]
        with open(filename,'wb') as f:
            f.write(response.body)

在cmd命令下运行

scrapy crawl dmoz

这时候就会发现再tur的文件夹下有两个名为“33”和“39”的文件
使用notepad++打开,就是网页的源代码
接着在cmd命令下找到tur文件夹
调用dmoz的爬虫

理论上会出现网页的源代码,但不知道哪里出错了。
开始列表没加逗号,但加了还是错了。

后来做没有问题了
先爬后取,从源代码中找出title link desc

Selector是一个选择器,有四个基本方法:

  1. xpath():传入xpath表达式,返回该表达式所对应的所以节点的selector list 列表。
  2. css():传入css表达式,返回该表达式所对应的所以节点的selector list 列表。
  3. extract():序列化该节点位unicode字符串并返回list。
  4. re():根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

然后在cmd下输入

scrapy shell "http://www.chinadmoz.org/subindustry/33/"
resonse.headers#来找头

用XPath找title

response.xpath('//title/text()').extract()   #将得到的title字符串化

然后通过网页审查元素找到想要的内容。
中间还是遇到比较多问题的
运行

scrapy crawl dmoz

的时候总是失败
使用的是Python3.7,安装完scrapy和一些依赖的库后运行scrapy crawl spidertieba。出现报错,报错信息是:

 File "c:\users\administrator.user-20160420ae\appdata\local\programs\python\pyt
hon37-32\lib\site-packages\twisted\conch\manhole.py", line 154
    def write(self, data, async=False):
                              ^
SyntaxError: invalid syntax

解决方案:

打开目录的源码文件(错误提示里有)
将变量名async换一个名字,例如换成shark,(全部都替换掉)就可以编译过了

def write(self, data, shark=False):

然后首次运行scrapy的crawl出现:ModuleNotFoundError: No module named ‘win32api’ 错误

pip3 install pywin32

完美解决

之前都是上次的错误,这次这里还是挺顺利的,用的是anaconda的spyder编辑器

title = sel.xpath('//ul[@class="boxbdnopd"]/li/div/h4/a/text()').extract()
link = sel.xpath('//ul[@class="boxbdnopd"]/li/div/h4/a/@href').extract()
desc = sel.xpath('//ul[@class="boxbdnopd"]/li/div/p/text()').extract()

分别找到了title,link,desc和dmoz.org是有一定区别的,其实不加[@class=“boxbdnopd”]也是可以的,因为后面都是唯一的,这个网站还是比较科学的
测试完成以后就开始开搞了

class DmozSpider(scrapy.Spider):
    name = 'dmoz'
    allowed_domain = ['chinadmoz.org']
    start_urls = [
            'http://www.chinadmoz.org/subindustry/33/',
            'http://www.chinadmoz.org/subindustry/39/'
                  ]
    
    def parse(self,response):
        sel = scrapy.selector.Selector(response)
        #切记这个结束时没有斜杠,因为这个找了好久
        sites = sel.xpath('//ul[@class="boxbdnopd"]/li/div')
        for site in sites:
            title = site.xpath('h4/a/text()').extract()
            link = site.xpath('h4/a/@href').extract()
            desc = site.xpath('p/text()').extract()
            print(title,link,desc)

保存,然后就可以去cmd里面接的运行

scrapy crawl dmoz

会返回title,link,desc,这已经成功一大半了

就from tur.items import DmozItem这个代码死活打不进去
from …items import *
from …items import DmozItem
都没有用,我把items.py这个文件复制到spiders文件夹下
也就是和dmoz_spider.py同一文件夹下,显示没有items,反正也时运行不了
最后实在没有办法,直接就放进来了,这回倒时可以了
到底问题出在哪里还得再研究研究

import scrapy

class DmozItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

class DmozSpider(scrapy.Spider):
    name = 'dmoz'
    allowed_domain = ['chinadmoz.org']
    start_urls = [
            'http://www.chinadmoz.org/subindustry/33/',
            'http://www.chinadmoz.org/subindustry/39/'
                  ]
    
    def parse(self,response):

        sel = scrapy.selector.Selector(response)
        sites = sel.xpath('//ul[@class="boxbdnopd"]/li/div')
        items = [] 
       
        for site in sites:
            item = DmozItem() 
            item ['title'] = site.xpath('h4/a/text()').extract()
            item ['link'] = site.xpath('h4/a/@href').extract()
            item ['desc'] = site.xpath('p/text()').extract()
            items.append(item)
      
        return items

最后在运行一次

scrapy crawl dmoz

没问题,保存信息的最简单的方法是通过Feed exports,主要有四种:JSON,JSON lines,CSV,XML。
我们将结果用最常用的JSON导出,命令如下:

scrapy crawl dmoz -o items.json -t json  

-o 后面是导出文件名,-t 后面是导出类型。

{"title": [], "link": [], "desc": []},
{"title": ["\u667a\u4f34\u513f\u7ae5\u673a\u5668\u4eba\u5b98\u7f51"], "link": ["http://www.zibrobot.com"], "desc": ["\u667a\u4f34\u513f\u7ae5\u673a\u5668\u4eba\u662f\u5e7f\u5dde\u667a\u4f34\u4eba\u5de5\u667a\u80fd\u79d1\u6280\u6709\u9650\u516c\u53f8\uff08\u7b80\u79f0\u201c\u667a\u4f34\u79d1\u6280\u201d\uff09\u51fa\u54c1\u7684\u667a\u4f34\u673a\u5668\u4eba\uff0c\u53c8\u53eb\u73ed\u5c3c\u673a\u5668\u4eba\uff0c\u4e5f\u53ebZIB\u667a\u4f34\u513f\u7ae5\u6210\u957f\u673a\u5668\u4eba\uff0c\u8fd9\u662f\u4eba\u5de5\u667a\u80fd\u673a\u5668\u4eba\uff0c\u667a\u4f34\u513f\u7ae5\u6210\u957f\u673a\u5668\u4eba\u62db\u5546\uff0c\u5168\u56fd\u667a\u4f34\u673a\u5668\u4eba\u4ee3\u7406\uff0c\u5728\u6e56\u5357\u536b\u89c6"]},
{"title": [], "link": [], "desc": []},
{"title": ["\u4e0a\u9976\u5fd7\u8fdc\u7f51\u7edc"], "link": ["http://www.0793pc.cn"], "desc": ["\u4e0a\u9976\u7535\u8111\u7ef4\u4fee\uff0c\u4e0a\u9976\u4fee\u7535\u8111\uff0c\u4e0a\u9976\u4e0a\u95e8\u4fee\u7535\u8111\uff0c\u4e0a\u9976\u7535\u8111\u516c\u53f8\uff0c\u4e0a\u9976\u7535\u8111\u7ef4\u4fee\u7535\u8bdd\uff0c\u4e0a\u9976\u505a\u7f51\u7ad9\uff0c\u4e0a\u9976\u5efa\u7f51\u7ad9\uff0c\u4e0a\u9976\u88c5\u76d1\u63a7\uff0c\u4e0a\u9976\u5b89\u88c5\u76d1\u63a7\uff0c\u4e0a\u9976\u76d1\u63a7\u5b89\u88c5\""]},
{"title": [], "link": [], "desc": []},
{"title": ["\u7231\u5c1a\u6570\u7801\u7f51"], "link": ["http://www.feimeng.vip"], "desc": ["\u7231\u5c1a\u6570\u7801\u7f51\uff0c\u6b63\u54c1\u624b\u673a\u63a8\u8350\uff0c\u76f8\u673a\u63a8\u8350\uff0c\u5e73\u677f\u63a8\u8350\uff0c\u54c1\u7c7b\u9f50\u5168\uff0c\u8d28\u91cf\u4fdd\u8bc1\uff0c\u4e3a\u60a8\u63d0\u4f9b\u4f18\u8d28\u6570\u7801\u9009\u8d2d\uff01"]},
………………

其实在cmd中看的时候本身时中文的,不知道为什么变成二进制了。

{'desc': ['智伴儿童机器人是广州智伴人工智能科技有限公司(简称“智伴科技”)出品的智伴机器人,又叫班尼机器人,也叫ZIB智伴儿童成长机器人,这是人工智能机器人,智伴儿童成长机器人招商,全国智伴机器人代理,在湖南卫视'],
 'link': ['http://www.zibrobot.com'],
 'title': ['智伴儿童机器人官网']}
2018-10-16 00:09:51 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.chinadmoz.org/subindustry/33/>
{'desc': [], 'link': [], 'title': []}
2018-10-16 00:09:51 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.chinadmoz.org/subindustry/33/>
{'desc': ['上饶电脑维修,上饶修电脑,上饶上门修电脑,上饶电脑公司,上饶电脑维修电话,上饶做网站,上饶建网站,上饶装监控 ,上饶安装监控,上饶监控安装"'],
 'link': ['http://www.0793pc.cn'],
 'title': ['上饶志远网络']}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值