Scrapy 安装及基础操作

Scrapy 安装:

https://www.lfd.uci.edu/~gohlke/pythonlibs/   各种whl安装依赖库文件

1 . wheel        pip install wheel    

2. lxml                      https://lxml.de/

3. PyOpenssl   https://pypi.org/project/pyOpenSSL/   pip install pyopenssl

   Import  OpenSSL

4.Twisted      

Twisted是一个事件驱动型的网络引擎。由于事件驱动编程模型在Twisted的设计哲学中占有重要的地位,因此这里有必要花点时间来回顾一下究竟事件驱动意味着什么。

事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。

 

5. Pywin32     

6. scrapy        pip install scrapy

 

创建项目

在开始爬取之前,您必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行下列命令:

scrapy startproject tutorial

该命令将会创建包含下列内容的 tutorial 目录:

tutorial/

    scrapy.cfg

    tutorial/

        __init__.py

        items.py

        pipelines.py

        settings.py

        spiders/

            __init__.py

            ...

这些文件分别是:

scrapy.cfg: 项目的配置文件

tutorial/: 该项目的python模块。之后您将在此加入代码。

tutorial/items.py: 项目中的item文件.

tutorial/pipelines.py: 项目中的pipelines文件.

tutorial/settings.py: 项目的设置文件.

tutorial/spiders/: 放置spider代码的目录.

 

 

目标站点: 官方教程网站quotes.toscrape.com,这是一个列出着名作家引用的网站

 

 

 

 

实战:

 

  1. 创建项目 ,目录文件用运行窗口打开,输入scrapy        startproject scrapy_23_tutorial

Pycharm打开项目 如下图,将项目 的根目录作为源根目录,在运行调用items时不会报错。项目文件夹会变蓝色。

 

  1. 在\scrapy_23_tutorial\scrapy_23_tutorial\spiders 下创建quotes.py
# -*- coding: utf-8 -*-

import scrapy



class QuotesSpider(scrapy.Spider):

   name = "quotes"   # 用于区别Spider,该名字必须是唯一的

# 包含了spider允许爬取的域名(domain)列表(list)
  
allowed_domains = ["quotes.toscrape.com"]
  
# 包含了Spider在启动时进行爬取的url列表。 第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
  
start_urls = ['http://quotes.toscrape.com/']

 
def parse(self, response)
  
# parse() spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。
   # 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL Request 对象。
   print(response.text)

 

 

运行项目:scrapy  crawl  quotes

 

  1. Items.Py 文件下

from scrapy import Field,Item

class Scrapy23TutorialItem(Item):
   
# define the fields for your item here like:
    # name = scrapy.Field()
   
text = Field()
    author
= Field()
    tags
= Field()

 

 

  1. 爬取 名言并进行翻页。 Css 选择器

http://upload-images.jianshu.io/upload_images/4731059-6ce96761eca5898c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

http://upload-images.jianshu.io/upload_images/4731059-d491d424302cce8f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

http://upload-images.jianshu.io/upload_images/4731059-fb9a813d2fbb21dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

 

from scrapy_23_tutorial.items import Scrapy23TutorialItem

import scrapy



class QuotesSpider(scrapy.Spider):

   name = "quotes"   # 用于区别Spider,该名字必须是唯一的

   allowed_domains = ["quotes.toscrape.com"]

   start_urls = ['http://quotes.toscrape.com/']

 

def parse(self, response):
  
# parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。
   # 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
  
quotes = response.css('.quote')
  
for quote in quotes:
     
item = Scrapy23TutorialItem()  #
      text
= quote.css('.text::text').extract_first()  # 获取.text 内的text文本内容
     
author = quote.css('.author::text').extract_first()
      tags
= quote.css('.tags .tag::text').extract()
      item[
'text']=text
      item[
'author'] = author
      item[
'tags'] = tags
     
yield item

   next
= response.css('.col-md-8 .pager .next a::attr(href)').extract_first()
   url
= response.urljoin(next)  # 添加url 后部
  
yield scrapy.Request(url=url, callback=self.parse)

 

 

  1. 爬取的items数据 存储: scrapy  crawl  quotes  -o  名字.存储类型后缀

4.1.命令行输入

D:\Py_scrapy\scrapy_23_tutorial>scrapy  crawl  quotes  -o  quotes.json

将生产 quotes.json  标准的json格式文件

4.2. scrapy  crawl  quotes  -o  quotes.jl

将生产 quotes.jl  单独一条数据包含一个item

4.3. scrapy  crawl  quotes  -o  quotes.csv

4.4. scrapy  crawl  quotes  -o  quotes.xml

等等…

 

 

  1. 存储items数据前进行处理

Pipelines.py 下

 

import pymongo
from scrapy.exceptions import DropItem

class TextPipeline(object):
   
def __init__(self):
       
self.limit = 50

   
def process_item(self, item, spider):
       
if item['text']:
           
if len(item['text']) > self.limit:
               
item['text'] = item['text'][0:self.limit].rstrip() + '...'
           
return item
       
else:
           
return DropItem("Missing Text")

class MongoPipeline(object):

   
def __init__(self,mongo_url , mongo_db):
       
self.mongo_url = mongo_url
       
self.mongo_db = mongo_db

   
@classmethod
   
def from_crawler(cls, crawler):
       
return cls(
           
mongo_url=crawler.settings.get('MONGO_URL'),
           
mongo_db = crawler.settings.get('MONGO_DB')
        )

   
def open_spider(self,spider):
       
self.client = pymongo.MongoClient(self.mongo_url)
       
self.db = self.client[self.mongo_db]

   
def process_item(self,item , spider):
       
name = item.__class__.__name__
       
self.db[name].insert(dict(item))
       
return item

   
def close_spider(self,spider):
       
self.client.close()

 

 

  1. 在setting.py 下

MONGO_URL = 'localhost'
MONGO_DB = 'scrapy_23_tutorial'

ITEM_PIPELINES = {
  
'scrapy_23_tutorial.pipelines.TextPipeline': 300,
  
'scrapy_23_tutorial.pipelines.MongoPipeline': 400
}
# Crawl

 

发布了16 篇原创文章 · 获赞 1 · 访问量 1566

猜你喜欢

转载自blog.csdn.net/weixin_41300650/article/details/103759580