zoukankan      html  css  js  c++  java
  • Scrapy基本使用

    wusir

    Twisted下载

    Twisted安装不成功解决办法:把Twisted-17.1.0-cp36-cp36m-win_amd64.whl改为Twisted-17.1.0-py36-none-any.whl然后再进行安装。

    Scrapy是一个大而全的爬虫组件;

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。
    其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

    一、Scrapy的安装

    window:

    a. pip3 install wheel
    b. 下载twisted 
    c. cmd切换到Twisted目录,执行 pip3 install Twisted‑17.1.0‑py36‑none-any.whl d. pip3 install scrapy

    二、Scrapy的基本使用

    1、新建一个文件day125:C:Pythonzhday125,   切换至此目录下

    2、创建project

    cmd创建一个project,名称为xdb  ---在cmd中:

    C:Pythonzhday125>scrapy startproject xdb

    执行上面命令后在day125中会自动生成一个名为xdb的项目,里面有两个文件:

     

     xdb文件中:

     

     文件说明:

    • spiders      爬虫目录,如:创建文件,编写爬虫规则
    • items.py    设置数据存储模板,用于结构化数据,如:Django的Model
    • middlewares.py 中间件
    • pipelines    数据处理行为,如:一般结构化的数据持久化
    • settings.py 配置文件,如:递归的层数、并发数,延迟下载等 

    3、创建爬虫项目:

    切换至xdb目录下,在cmd中:

    C:Pythonzhday125xdb>scrapy genspider chouti chouti.com

    打开chouti.py:

    #chouti.py
    import scrapy
    
    class ChoutiSpider(scrapy.Spider):
        name = 'chouti'
        allowed_domains = ['chouti.com']
        start_urls = ['http://chouti.com/']
    
        def parse(self, response):
            pass

     4、启动爬虫

    scrapy crawl chouti

    三、scrapy示例:获取抽屉新闻

    为了操作方便,在pycharm找到xdb项目并打开

     

     chouti.py

     

     在cmd中启动项目:

     

     --nolog表示不打印日志。

    -----------------------------------------------------------------------------------

    爬取chouti新闻时: 

    chouti.py

    import scrapy
    from scrapy.http.response.html import HtmlResponse
    # import sys,os,io
    # sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
    #如果项目启动出错可以开打上面两条命令
    
    class ChoutiSpider(scrapy.Spider):
        name = 'chouti'
        allowed_domains = ['chouti.com']
        start_urls = ['http://chouti.com/']
    
        def parse(self, response):
            # print(response,type(response)) # 对象
            # print(response.text)
            """
            from bs4 import BeautifulSoup
            soup = BeautifulSoup(response.text,'html.parser')
            content_list = soup.find('div',attrs={'id':'content-list'})
            """
    
            # xpath:帮助我们找标签,它是HTML内置的解析器
            # //表示去当前html子孙中找div并且id=content-list
            # /表示去儿子里面去找div标签
            f = open('news.log', mode='a+')  #打开一个文件,a+:追加
            item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')
    
    
            for item in item_list:
                text = item.xpath('.//a/text()').extract_first() #取第一个a标签的文本内存
                href = item.xpath('.//a/@href').extract_first()  #取第一个a标签的属性
                print(href,text.strip())
                f.write(href+'
    ') #写入爬取的内容
            f.close()
    
            #上面写入的是第一页的数据,还需要跳转到第二页、第三页写入第二页数据
            #找到分页的所有页面
            page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract()
            for page in page_list:
                from scrapy.http import Request
                page = "https://dig.chouti.com" + page
                yield Request(url=page,callback=self.parse) # https://dig.chouti.com/all/hot/recent/2
                #通过yield Request()告诉scrapy再次向指定的url发起请求

     其它:

    """
    
    """
    
    
    # 原来
    """
    import requests
    
    url_list = ['http://www.baidu.com', 'http://www.baidu.com', 'http://www.baidu.com', ]
    
    for item in url_list:
        response = requests.get(item)
        print(response.text)
    
    """
    
    # 现在
    """
    非阻塞,不等待; 我向贝贝、高件套、小东北发起连接请求时候,不等连接再去连下一个,而是发送一个只会,马上发送下一个。
    
        import socket 
        sk = socket.socket()
        sk.setblocking(False)
        sk.connect((1.1.1.1,80))
        
        import socket 
        sk = socket.socket()
        sk.setblocking(False)
        sk.connect((1.1.1.2,80))
        
        import socket 
        sk = socket.socket()
        sk.setblocking(False)
        sk.connect((1.1.1.3,80))
    
    异步,回调; 我帮助龙泰、呼呼、刘淞找到想要的人只会,我会主动通知他们。
        def callback(contents):
        print(contents)
    事件循环; 我,我一直在循环三个socket任务(即:贝贝、高件套、小东北),检查他三个状态:是否连接成功;是否返回结果。
    
    
    总结:
        官方:基于事件循环的异步非阻塞模块。
        白话:一个线程同时可以向多个目标发起Http请求。
        
    """
    
    from twisted.web.client import getPage, defer
    from twisted.internet import reactor
    
    # 第一部分:代理开始接收任务
    def callback(contents):
        print(contents)
    
    deferred_list = [] # [(龙泰,贝贝),(刘淞,宝件套),(呼呼,东北)]
    url_list = ['http://www.bing.com', 'https://segmentfault.com/','https://stackoverflow.com/' ]
    for url in url_list:
        deferred = getPage(bytes(url, encoding='utf8')) # (我,要谁)
        deferred.addCallback(callback)
        deferred_list.append(deferred)
    
    
    # # 第二部分:代理执行完任务后,停止
    dlist = defer.DeferredList(deferred_list)
    
    def all_done(arg):
        reactor.stop()
    
    dlist.addBoth(all_done)
    
    # 第三部分:代理开始去处理吧
    reactor.run()
    Twisted
  • 相关阅读:
    使用PWS调试cgi,php
    解决联想电脑常见故障及内存不足的几种方法
    How Many Tables (并查集)
    Prim
    小希的迷宫(并查集)
    并查集
    Is It A Tree?(并查集)
    hdu 1003 Max Sum(最大子窜和)
    More is better(并查集)
    01背包精讲
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/13288343.html
Copyright © 2011-2022 走看看