zoukankan      html  css  js  c++  java
  • Python项目--Scrapy框架(一)

    环境

    win8, python3.7, pycharm

    正文

    1.Scrapy框架的安装

    在cmd命令行窗口执行:

    pip install Scrapy

    即可完成Scrapy框架的安装

    2. 创建Scrapy项目

    在cmd命令行窗口下切换到想要的目录下, 我这里是C:UsersAdministratorPycharmProjectsuntitledTestsScrapy

    执行下面代码, 即可在当前的"Scrapy"目录下生成JianShu项目文件夹. 

    scrapy startproject JianShu

    文件夹结构如下:

     

    items.py: 定义要爬取的项目

    middlewares.py: 定义爬取时的中间介质

    pipelines.py: 定义数据管道

    settings.py: 配置文件

    scrapy.cfg: Scrapy部署时的配置文件

    3. 创建JianShuSpider

    在cmd命令行依次执行以下代码, 即可在"JianShu/spiders"目录下创建JianShuSpider.py文件

    cd JianShu
    scrapy genspider JianShuSpider JianShuSpider.toscrape.com

     4. 定义要爬取的项目

    在items.py中确定要爬取的信息: 简书热门专题中的主题, 内容, 文章数, 粉丝数这四个信息

     1 import scrapy
     2 from scrapy.item import Item, Field
     3 
     4 class JianshuItem(Item):
     5     # define the fields for your item here like:
     6     # name = scrapy.Field()
     7     title = Field()         #主题
     8     content  = Field()      #内容
     9     article = Field()       #文章
    10     fans = Field()          #粉丝

    5. 编写爬虫主程序

    简书热门专题采用异步加载, 在NetWork中选择XHR来确定异步加载的url: https://www.jianshu.com/recommendations/collections?page=(1,2,3,4.....)&order_by=hot

    在JianShuSpider.py中编写主程序:

     1 import scrapy
     2 from scrapy.spiders import CrawlSpider
     3 from scrapy.selector import Selector
     4 from JianShu.items import JianshuItem
     5 from scrapy.http import Request
     6 class JianShu(CrawlSpider):
     7     name = 'JianShu'
     8     allowed_domains = ['JianShuSpider.toscrape.com']
     9     start_urls = ['https://www.jianshu.com/recommendations/collections?page=1&order_by=hot']
    10     def parse(self, response):
    11         item = JianshuItem()
    12         #对源码进行初始化
    13         selector = Selector(response)
    14         #采用xpath进行解析
    15         infos = selector.xpath('//div[@class="collection-wrap"]')
    16         for info in infos:
    17             title = info.xpath('a[1]/h4/text()').extract()[0]
    18             content = info.xpath('a[1]/p/text()').extract()
    19             article = info.xpath('div/a/text()').extract()[0]
    20             fans = info.xpath('div/text()').extract()[0]
    21             #加入判断, 如果content存在则返回content[0], 否则返回''
    22             if content:
    23                 content = content[0]
    24             else:
    25                 content = ''
    26             item['title'] = title
    27             item['content'] = content
    28             item['article'] = article
    29             item['fans'] = fans
    30             yield item
    31         #列表生成式, 生成多个url
    32         urls = ['https://www.jianshu.com/recommendations/collections?page={0}&order_by=hot'.format(str(page)) for page in range(2,37)]
    33         for url in urls:
    34             yield Request(url,callback=self.parse)

    6. 保存到MongoDB

    利用pipelines数据管道将其存储至MongoDB, 在pipelines.py编写:

     1 import pymongo
     2 
     3 class JianshuPipeline(object):
     4     def __init__(self):
     5         '''连接Mongodb'''
     6         client = pymongo.MongoClient(host='localhost')
     7         db = client['test']
     8         jianshu = db["jianshu"]
     9         self.post = jianshu
    10     def process_item(self, item, spider):
    11         '''写入Mongodb'''
    12         info = dict(item)
    13         self.post.insert(info)
    14         return item

    7. setting配置

     1 BOT_NAME = 'JianShu'
     2 SPIDER_MODULES = ['JianShu.spiders']
     3 NEWSPIDER_MODULE = 'JianShu.spiders'
     4 #从网站请求头复制粘贴User-Agent
     5 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
     6 ROBOTSTXT_OBEY = True
     7 #设置等待时间5秒
     8 DOWNLOAD_DELAY = 5
     9 #配置项目管道
    10 ITEM_PIPELINES = {
    11    'JianShu.pipelines.JianshuPipeline': 300,
    12 }

    8. 新建main.py文件

    在JianShu文件目录下新建main.py文件, 编辑如下代码:

    1 from scrapy import cmdline
    2 cmdline.execute('scrapy crawl JianShu'.split())

    9. 运行main.py文件

    在运行之前, 需确保mongodb服务已经启动, 执行结果如下:

  • 相关阅读:
    java自学
    java自学
    java自学
    java自学
    java自学
    java自学
    java自学
    自学Java0730
    自学Java0729
    自学Java0728
  • 原文地址:https://www.cnblogs.com/star-zhao/p/9677721.html
Copyright © 2011-2022 走看看