首页 > 其他 > 详细

爬虫之scrapy

时间:2019-05-24 13:20:09      阅读:155      评论:0      收藏:0      [点我收藏+]

一 . scrapy初识

  安装步骤:

Linux:
    pip3 install scrapy

Windows:
      1. pip3 install wheel

      2. 下载twisted: http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

      3. 进入下载twisted目录,执行 pip3 install Twisted?17.1.0?cp35?cp35m?win_amd64.whl

      4. pip3 install pywin32

      5. pip3 install scrapy

  创建项目步骤:

1. 随便建一个文件夹
2. 进入这个文件夹内,shift+右键,打开终端(命令行)
3. 创建项目命令:  scrapy startproject  项目名称
4. 到项目下: cd 项目名称
5. 创建爬虫文件: scrapy genspider  爬虫文件名  url(先随便写,可以改)
6. 用pycharm打开这个文件夹,就可以看到 项目名下的spiders中有爬虫文件名了

  打开爬虫文件

    基于终端存储

# -*- coding: utf-8 -*-
import time
import scrapy   # 飘红不用管
class FirstSpider(scrapy.Spider):
    # name就是爬虫文件的名称
    name = first
    
    # 允许的域名,一般都注释掉,不用限定
    # allowed_domains = [‘www.xxx.com‘]
    
    # 起始的url列表,在列表里的url都会被自动的发送请求,里面可以写多个
    start_urls = [http://pic.netbian.com/4kmeinv/index_2.html]

    # 解析数据,有几个url就会执行几次这个函数
    def parse(self, response):
        # 拿到相应数据,这个xpath和etree的xpath不太一样
        li_list = response.xpath(//div[@class="slist"]//li)
        names = []
        for li in li_list:
            time.sleep(0.2)  # 别的网站可能不用,这个网址不让请求频率太高
            # 特性,xpath返回的列表元素一定是selector对象,使用extract方法可以获取selector中data中的数据
            # author = div.xpath(‘地址‘)[0].extract()
            src = li.xpath(.//img/@src).extract_first()
            all_src = http://pic.netbian.com + src
            # 基于终端指令进行持久化存储的时候解析内容需要是字典格式或者是None
            dic = {
                name: all_src
            }
            names.append(dic)
            # print(src)
        return names

  执行这个文件

# 这里执行不用实例化类然后右键执行,需要在终端执行
# 执行之前需要在settings.py中修改ROBOTSTXT_OBEY = False,并且USER-AGENT也需要改.
执行命令:
scrapy crawl 爬虫文件名  # 有日志文件
scrapy crawl 爬虫文件名 --nolog   一般不用,如果报错找不到,除非100%没错

持久化存储(基于终端指令,只能存到硬盘上,不能存到数据库上)
scrapy crawl  爬虫文件名 -o  磁盘文件路径+名称.csv   如果不是.csv格式会报错

# 比如说: scrapy crawl  spiderName -o  beauty.csv   没有写文件路径直接保存到当前目录 

  基于管道存储

首先到配置文件中把 ITEM_PIPELINES 打开, 后面的数字是权重,数字越小证明权重越大,
这里面可以写多个类,比如存在不同地方(本地,数据库等)

  爬虫文件(xiaohua.py)

# -*- coding: utf-8 -*-
import scrapy
from ..items import FirstbloodItem

class XiaohuaSpider(scrapy.Spider):
    name = xiaohua
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [http://www.521609.com/daxuemeinv/]

    def parse(self, response):
        li_list = response.xpath(//*[@id="content"]/div[2]/div[2]//li)
        
        for li in li_list:
            src = li.xpath(.//img/@src).extract_first()
            if not src:
                continue
            all_src = http://www.521609.com + src

            # 实例化一个item对象
            item = FirstbloodItem()
            # 由于items中的Field底层是字典类型,所以要[]取值
            item[img_url] = all_src

            # item提交给管道
            yield item

  pipelines.py

# 当前类的作用是将解析的数据存储到某一个平台中(本地或数据库)
class FirstbloodPipeline(object):
    f = None
    # 由于传过来的item对象是循环产生的,所以不能用with
    def open_spider(self, spider):  # 由于原方法里有spider,所以这也要写
        print(开始爬虫)
        self.f = open(./xiaohua.txt, w, encoding=utf-8)

    # 作用:实现持久化存储的操作
    # 该方法的item参数就可以接受爬虫文件提交过来的item对象
    def process_item(self, item, spider):
        img_url = item.get(img_url)
        self.f.write(图片链接-> + img_url + \n)
        # 返回值的作用就是将item传递给下一个即将被执行的管道类
        return item

    def close_spider(self, spider): 
        print(结束爬虫)
        self.f.close()

  items.py

import scrapy

class FirstbloodItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    
    # 前边的变量名随便写,后边必须是scrapy.Field(),有几个参数就写几个
    img_url = scrapy.Field()

  然后在终端执行 scrapy crawl xiaohua就可以啦!

 

 

爬虫之scrapy

原文:https://www.cnblogs.com/attila/p/10917561.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!