• Scrapy框架基本使用


    1.1安装Scrapy框架

    先安装vc++运行库,https://blog.csdn.net/qq_38161040/article/details/88203864

    pip安装pywin32包,输入命令pip install pywin32,然后按顺序安装Twisted,lxml,Scrapy。

    1.2创建一个scrapy项目

    新创建一个目录,按住shift-右键-在此处打开命令窗口,输入:scrapy startproject tnt,即可创建一个tnt文件夹

     

    文件的功能:

    scrapy.cfg:配置文件

    spiders:存放你Spider文件,也就是你爬取的py文件

    items.py:抓取内容描述

    middlewares.py:定义Downloader Middlewares(下载器中间件)和Spider Middlewares(蜘蛛中间件)的实现

    pipelines.py:定义Item Pipeline的实现,实现数据的清洗,储存,验证。

    settings.py:全局配置

    1.3创建一个spider

    cd到tnt文件夹下,按住shift-右键-在此处打开命令窗口,输入:scrapy genspider top250 movie.douban.com/top250

    top250是爬虫名,movie.douban.com/top250是域名

    我们来看一下使用命令创建的有什么。

    name:爬虫名

    allowed_domains:是爬取的域名。

    start_urls:是Spider爬取的网站,定义初始的请求url,可以多个。

    parse方法:将网页源码生成soup对象,然后解析出数据item通过生成器yield返回,并指定URL的处理函数为self.parse。

    response参数:是请求网页后返回的内容,也就是你需要解析的网页。

    1.4修改items.py
    from scrapy import Item,Field
    
    class TntItem(Item):
        # define the fields for your item here like:
        name = Field()
        fen = Field()
        words = Field()

    1.5修改爬虫文件top250.py:

    # -*- coding: utf-8 -*-
    import scrapy
    from items import TntItem
    from bs4 import BeautifulSoup
    import re
    
    class Top250Spider(scrapy.Spider):
        name = 'top250'
        allowed_domains = ['movie.douban.com']
        start_urls = ['https://movie.douban.com/top250/']
    
        def parse(self, response):
            soup=BeautifulSoup(response.body.decode('utf-8','ignore'),'lxml')
            ol=soup.find('ol',attrs={'class':'grid_view'})
            for li in ol.find_all('li'):
                tep=[]
                titles=[]
                for span in li.find_all('span'):
                    if span.has_attr('class'):
                        if span.attrs['class'][0]=='title':   
                            titles.append(span.string.strip().replace(',',','))  #获取电影名
                        elif span.attrs['class'][0]=='rating_num':
                            tep.append(span.string.strip().replace(',',','))     #获取评分
                        elif span.attrs['class'][0]=='inq':
                            tep.append(span.string.strip().replace(',',','))     #获取评论
                tep.insert(0,titles[0])
                item=TntItem()
                item['name']=tep[0]
                item['fen']=tep[1]
                item['words']=tep[2]
                yield item
            a=soup.find('a',text=re.compile("^后页"))
            if a:
                yield scrapy.Request("https://movie.douban.com/top250"+
                    a.attrs['href'],callback=self.parse)            
     

    urllib.parse.urljoin(),构建完整的绝对url

    >>>from urllib.parse import urljoin
    >>> urljoin("http://www.chachabei.com/folder/currentpage.html", "anotherpage.html")
    'http://www.chachabei.com/folder/anotherpage.html'
    >>> urljoin("http://www.chachabei.com/folder/currentpage.html", "/anotherpage.html")
    'http://www.chachabei.com/anotherpage.html'
    >>> urljoin("http://www.chachabei.com/folder/currentpage.html", "folder2/anotherpage.html")
    'http://www.chachabei.com/folder/folder2/anotherpage.html'
    >>> urljoin("http://www.chachabei.com/folder/currentpage.html", "/folder2/anotherpage.html")
    'http://www.chachabei.com/folder2/anotherpage.html'
    >>> urljoin("http://www.chachabei.com/abc/folder/currentpage.html", "/folder2/anotherpage.html")
    'http://www.chachabei.com/folder2/anotherpage.html'
    >>> urljoin("http://www.chachabei.com/abc/folder/currentpage.html", "../anotherpage.html")
    'http://www.chachabei.com/abc/anotherpage.html'

    1.6修改数据存储文件pipelines.py
    import csv
    
    class TntPipeline(object):
        def __init__(self):
            self.fp=open('TOP250.csv','w',encoding='utf-8')
            self.wrt=csv.DictWriter(self.fp,['name','fen','words'],lineterminator='
    ')  #lineterminator='
    '作用是不换行
            self.wrt.writeheader()
    
        def __del__(self):
            self.fp.close()
          
        def process_item(self, item, spider):
            self.wrt.writerow(item)
            return item
    1.7修改配置文件settings.py
    BOT_NAME = 'tnt'
    
    SPIDER_MODULES = ['tnt.spiders']
    NEWSPIDER_MODULE = 'tnt.spiders'
    
    #添加用户代理
    USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    
    # 当爬取内容不符合该协议且仍要爬取时,设置 ROBOTSTXT_OBEY = False ,不遵守此协议
    ROBOTSTXT_OBEY = False
    ITEM_PIPELINES={
        'tnt.pipelines.TntPipeline':300,
    }
    1.8创建主程序main.py
    from scrapy.crawler import CrawlerProcess
    from scrapy.utils.project import get_project_settings
    from spiders.top250 import Top250Spider
    
    #获取settings.py模块的位置
    settings=get_project_settings()
    process=CrawlerProcess(settings=settings)
    
    #可以添加多个spider
    #process.crawl(Spider1)
    #process.crawl(Spider2)
    process.crawl(Top250Spider)
    
    #启动爬虫,会阻塞,直到爬取完成
    process.start() 
    2、scrapy选器的使用
    #1、xpath取文本
    response.xpath("//div[@id='images']/text()").extract_first()
    #取标签属性
    response.xpath("//div[@id='images']/@class").extract()
    #模糊匹配
    response.xpath('//div[contains(@href,"image")]/@href').extract()
    #二次定位
    items=response.xpath('//div[@id="images"]')
        for item in items:
            #需要加.//
            title=item.xpath('.//a/text()').extract()
    #正则匹配
    response.xpath('//div').re('sd')
    response.xpath('//div').re_first('')   #正则匹配第一个
    
    #2、css取文本
    name = item.css(".images>a::text").extract_first()
    #取标签属性
    link = item.css(".images>a::attr(href)").extract_first()
    #模糊匹配
    response.css('a[href*=image]::attr(href)').extract()
    #二次定位
    items=response.css('div .images')
        for item in items:
            #不需要加.//
            title_1=item.css('a::text').extract()
    3、scrapy交互模式
    在pycharm的terminal中,输入scrapy shell www.域名.com,可进入交互模式方便调试。
    例如:
    response
    response.xpath("//tbody/tr").extract_first()
    items=response.xpath('//div[@class="searchItem"]')
    items[0]
    scrapy crawl spider spider.json :运行爬虫并把数据保存到一个json文件
    scrapy crawl spider -o spider.csv:保存到csv
    scrapy crawl spider -o ftp://user:password@ftp.example.com/path/spider.csv  :保存到ftp
     
     
     
     
  • 相关阅读:
    seafile-docker
    nextcloud-docker
    nexus升级
    vSphere中设置K3OS
    文件大小排序
    Java SpringBoot Beetl模板
    电商 Python 生成刷单公司需要的评论格式2
    电商 Python 生成刷单公司需要的评论格式
    电商 Python 访客Excel合并
    Java SpringBoot Thymeleaf模板
  • 原文地址:https://www.cnblogs.com/xiaohuhu/p/12366155.html
Copyright © 2020-2023  润新知