day99 파충류 scrapy의 구조를 설명 소개

scrapy 소개, 프리젠 테이션 아키텍처 (프레임 워크) ghref

scrapy는 파충류 커뮤니티 장고입니다

파충류 프레임 워크, 사람들은 지정된 위치에 지정 될 수있는 코드를 작성하기 만하면 후, 코드를 작성

기반 트위스트 : 고성능

다섯 개 요소

엔진 : 대형 전원, 전체 데이터 흐름 제어

스케줄러 : 중복 제거, 대기

다운로드 : 다운로드, 데이터를로드에 대한 책임

파충류 : 요청과 응답을 다시 시작하기 위해 주요 기록이, 해결

프로젝트 파이프 라인 : 지속성 관련

두 미들웨어

중간 파충류 : 엔진과 (이하의) 러 사이

엔진과 다운 사이 (플러스 기관, 쿠키, 사용자 에이전트, 상속 셀레늄을 수정) : 미들웨어 다운로드

1582792665639

scrapy 설치 (창)

mac/linux:pip3 install scrapy
windows:
    pip3 install scrapy(大部分都可以)
-如果上面不行
        -pip3 install wheel   (xxx.whl文件安装模块)
      -下载pywin32:两种方式:1 pip3 install pywin32    2 下一个exe安装https://sourceforge.net/projects/pywin32/files/pywin32/
      -下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted   下载完是一个xxx.whl文件
    -执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl

파충류가 운영하는 파충류를 제작하는 프로젝트를 생성 scrapy

#通过命令创建项目,到指定的文件夹下
#创建项目(django中创建项目)
scrapy startproject 项目名
# 创建爬虫(django中创建app)在spiders文件夹下创建py文件,一个py文件就是一个爬虫(不要注册,没有注册一说)
scrapy genspider 爬虫名字 爬取地址
scrapy genspider chouti dig.chouti.com
#打开项目 pycharm打开
#运行爬虫 命令行下
scrapy crawl 爬虫名字
scrapy crawl 爬虫名字 --nolog #不打印日志
# 运行爬虫 py文件
# 在项目目录下创建一个py文件,假设交main.py,点击右键执行即可执行爬虫 等同于命令
from scrapy.cmdline import execute
execute(['scrapy','crawl','chouti'])
# execute(['scrapy','crawl','chouti','--nolog'])

내용 소개

-scarpyfirst 项目名
    -scrapy.cfg 上线相关的(不用管)
  -scrapyfirst 文件夹
    -spiders文件夹     :所有的爬虫写在这里面
        -chouti.py          :一个py文件就是一个爬虫(类似于django的app)
    -items.py         :配合管道,做数据存储(类似于django中models.py 写一个个的模型类)
    -middlewares.py   :中间件(爬虫中间件,下载中间件都写在这里面)
    -pipelines.py       :管道,持久化相关,数据存储卸载
    -settings.py            :配置文件相关

설정 소개

#配置文件全是大写
ROBOTSTXT_OBEY = False #是否遵循爬虫协议 如果是True,基本上网站都爬不了,遵循要爬取网站的爬虫协议 一般设置成False
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
LOG_LEVEL='ERROR' #只打印错误信息

scrapy 데이터 분석

css选择
    response.css().extract_first()#取第一个 只要是取一个就用它
xpath选择
    response.xpath().extract()#取所有 取所有的就用它

scrapy 영구 저장

第一种:通过命令:scrapy crawl chouti -o aa.csv#chouti是爬虫名 aa.csv文件名,不能用txt
    需要在parser解析方法中返回列表套字典
第二种:通过管道方式(文件,数据,redis,MongoDB),同时支持以多种方式存储
    1 在item.py中定义一个类 写属性(要存多少字段,就有多少属性)
    2 在爬虫中解析出数据 把数据放到这个类对象中,然后 yield item
    3 在配置文件中配置:ChoutiPipeline对应piplines.py中的类
    ITEM_PIPELINES = {
        'scrapyfirst.pipelines.ChoutiPipeline': 300,   # 数字表示优先级,数字越小,优先级越高
        }
    4 pipelines.py中写ChoutiPipeline类
    -open_spider:开启时调用,打开文件,打开数据库连接
    -process_item:存数据
    -close_sapider:关闭时调用,关闭文件,关闭数据库连接
    总结:ITEM_PIPELINES可以写多个,有优先级的 数字越小 优先级越大 一定要注意 process_item一定要return,否则后续就拿不到item了

첫 번째

# -*- coding: utf-8 -*-
import scrapy


class ChoutiSpider(scrapy.Spider):
    # 爬虫名字
    name = 'chouti'
    # 只允许爬取当前域名
    allowed_domains = ['dig.chouti.com']
    # 起始爬取的地址
    start_urls = ['http://dig.chouti.com/']

    #解析的方法
    def parse(self, response):
        li=[] #列表套字典
        #response 响应回来的对象
        # print(response)
        # 获取response的文本数据
        # print(response.text)
        #自带解析库
        # css选择
        '''
        div_list=response.css('div.link-item')
        for div in div_list:
            #不管用的css选择器还是xpath选择器 选出来的都是列表,都需要取出来
            # extract() 表示取出列表所有
            # extract_first()取出列表死一个
            desc=div.css('a.link-title::text').extract_first()
            # desc=div.css('a.link-title::text').extract()
            print(desc)
        '''
        # xpath选择
        '''
        div_list=response.xpath('/html/body/main/div/div/div[1]/div/div[2]/div[1]/div')
        for div in div_list:
            #可以混用
            # desc = div.css('a.link-title::text').extract_first()
            #xpath选择
            desc=div.xpath('./div/div/div[1]/a/text()').extract_first()
            print(desc)
        '''
        #自己写xpath
        div_list=response.xpath('//div[contains(@class,"link-item")]')
        for div in div_list:
            # 可以混用
            # desc = div.css('a.link-title::text').extract_first()
            # 用xpath选择
            # desc=div.xpath('./div/div/div[1]/a/text()')[0].extract() 一般不用
            desc=div.xpath('./div/div/div[1]/a/text()').extract_first()
            img_url=div.xpath('./div/a/img/@src').extract_first()
            # print(desc)
            # print(img_url)
            li.append({'desc':desc,'img_url':img_url})
        return li

두 번째

chouti.py

from scrapyfirst.items import ChoutiItem
class ChoutiSpider(scrapy.Spider):
    # 爬虫名字
    name = 'chouti'
    # 只允许爬取当前域名
    allowed_domains = ['dig.chouti.com']
    # 起始爬取的地址
    start_urls = ['http://dig.chouti.com/']

    #解析的方法
    def parse(self, response):
        #自己写xpath
        div_list=response.xpath('//div[contains(@class,"link-item")]')
        for div in div_list:
            # 可以混用
            # desc = div.css('a.link-title::text').extract_first()
            # 用xpath选择
            # desc=div.xpath('./div/div/div[1]/a/text()')[0].extract() 一般不用
            desc=div.xpath('./div/div/div[1]/a/text()').extract_first()
            img_url=div.xpath('./div/a/img/@src').extract_first()
            #实例化得到对象
            item=ChoutiItem()
            item['desc']=desc
            item['img_url']=img_url
            yield item

items.py

import scrapy


class ChoutiItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    desc=scrapy.Field()
    img_url=scrapy.Field()

pipelines.py

class ChoutiPipeline(object):
    def open_spider(self,spider):
        print('我开了')
        self.f=open('a.txt','w',encoding='utf-8')

    def process_item(self, item, spider):
        '''
         with open('b.txt','a',encoding='utf-8') as f:
        f.write(item['desc']+item['img_url']+'\n')
        '''
        self.f.write(item['desc']+item['img_url']+'\n')

        return item#return的原因是可以支持多种方式存储

    def close_spider(self,spider):
        self.f.close()
        print('我关了')
        
    #保存到数据库中    
class ChoutiMysqlPipeline(object):
    def open_spider(self, spider):
        # autocommit=True 表示自动提交
        self.conn = pymysql.connect(host='127.0.0.1', user='root', password='', database='chouti', port=3306)

    def process_item(self, item, spider):
        cursor = self.conn.cursor()
        sql = "insert into article (`desc`,img_url) values ('%s','%s')" % (item['desc'], item['img_url'])
        cursor.execute(sql)
        # 不要忘记了提交
        self.conn.commit()

        # return item#return的原因是可以支持多种方式存储

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

settings.py

ITEM_PIPELINES = {
   'scrapyfirst.pipelines.ChoutiPipeline': 300,
}

개별 보충

scrapy.Resuest '

# -*- coding: utf-8 -*-
import scrapy
import json
from scrapyfirst.items import ChoutiItem
class Huya2Spider(scrapy.Spider):
    name = 'huya2'
    allowed_domains = ['huya.com/cache.php?m=LiveList']
    start_urls = ['https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0']

    def parse(self, response):
        data=json.loads(response.text.encode('utf8')).get('data')
        max_page=data.get('totalPage')
        datas=data.get('datas')
        print(data)
        item = ChoutiItem()
        for dic in datas:
            item['introduction']=dic.get('introduction')
            item['nick']=dic.get('nick')
            item['totalCount']=dic.get('totalCount')
            item['url']='https://www.huya.com/'+dic.get('profileRoom')
            yield item
        for page in range(max_page):
            next_page_url=self.start_urls+f'&page={page}'
            print(next_page_url)
            yield scrapy.Request(url=next_page_url,callback=self.parse,dont_filter=True)
            '''
            Request类是一个http请求的类,url接链接 callback接回调函数
            Request对象在我们写爬虫,爬取一页的数据需要重新发送一个请求的时候调用。这个类需要传递一些参数。其中比较常用的参数有:
1.url    请求的url对象
2.callback  在下载器下载完相应的数据后执行的回调函数
3.method   请求的方式,默认为GET方法,可以设置为其他方法
4.meta   比较常用,用于在不同的请求之间传递数据用的.Request.meta属性的初始值。如果给定,则此参数中传递的dict将被浅拷贝。
5.encoding   编码。默认的为  utf-8,使用默认的就可以了。
6.dot_filter    表示不有调度器过滤,在执行多次重复的请求的时候就用的比较多。
7.cookie     请求的cookie。
8.errback    在发生错误的时候执行的函数。
Response对象一般是有Scrapy给你自动构建,因此开发者不需要关心如何创建Response对象,而是如何使用它,Response对象有很多属性,可以用开提取数据,主要有一下属性:
1.meta   从其他请求传过来的meta属性,可以用来保持多个请求之间的数据连接。
2.encoding   返回当前字符串编码和解码的格式。
3.text   将返回来的数据作为unicode字符串返回。
4.xpath   xpath选择器。
5.css   css选择器。
6.body   将返回来的数据作为bytes字符串返回。
7.status     响应的HTTP状态。默认为200。
8.flags     一个包含属性初始值的 Response.flags列表。如果给定,列表将被浅拷贝
9.request    属性的初始值Response.request。这代表Request生成此响应。
            '''

등반 등반 서랍 눈 치아

IDE, 개발 도구

당신이 IDE를 사용하는 일,

IDE 시리즈
자바 : eclipe (무료) myeclips (추가 요금) ieda (주로 자바 그를 사용)

파이썬 : pycharm, vscode (마이크로 소프트 자바 파이썬 밖으로 이동 무료 C)
이동 : Goland VSCode를

개발 앤드류스 : 이클립스 +의 ADT는, 구글이 인수 회사 JetBrains의 저작권 아이디어 + ADT = androidstatdio 년 자바 개발자 자바 많은 수의 원활 과거에 직접 전송 될 수있다, 자바 가상 머신

개발 아이폰 OS는 : 맥 엑스 코드를 사용해야합니다

JetBrains의 회사 가족 버킷 시리즈 : 생각 pycharm webstom goland PHP

시스템 파이썬 : 파이썬베이스, MySQL은, 프론트 엔드, 웹 크롤러, 데이터 분석, 인공 지능

자바 시스템

Javase : 기초

안드로이드 관련 학습 패키지 + 기반의 완료에

JavaEE 어플 : 웹 관련

javame : 모바일 개발 (안 안드로이드, 아이폰 OS, 아주 오래된 자바 전화 소프트웨어)

차이 : JDK, JRE, JVM

JDK는 : 자바 소프트 개발 툴킷, 자바 개발자들은 개발해야

JRE : 자바 런타임 환경

JVM : Java 가상 머신 어디에서나 실행 코딩 한 번, 크로스 플랫폼 (자바 프로그램은 가상 머신에서 실행해야합니다)

C / C ++ : Windows에서 실행하려면, 컴파일 된 exe는 windon에 필요

이동 후 ---> --- Windows 플랫폼에서 직접 컴파일 "크로스 플랫폼 컴파일러의 실행은 리눅스에서 실행 파일을 컴파일 할 수 있습니다

자바 코드를 작성 --- "진 (중간 상태)로 컴파일되지 않고 직접 실행할 수 있습니다 ---"운영 시스템은 자바 가상 머신 설치 (자바 가상 머신을 위로 적어도 500m 메모리를 차지했다 실행)가 필요합니다

추천

출처www.cnblogs.com/zqfzqf/p/12392299.html