• scrapy 资料


    先看看scrapy的框架流程,

    1,安装 scrapy https://www.cnblogs.com/zbllly/p/10294223.html 查看即可。

    2,新建scrapy项目

    scrapy startproject 项目名

    目录结构图

    3,cd到项目名下,创建任务。

    scrapy genspider 爬虫名 www.baidu.com(网站网址)

    参数解析:

    name,
    定义spider的名字的字符串,必须是唯一的,name是spider的最重要的属性,而且是必须的
    allowed_domains
    可选,包含spider允许爬取的域名的列表,当offsiterMiddleware启用时,域名不在列表的url不会被跟进
    start_urls 
    url列表,spider从该列表中开始进行爬取。 (列表生成式也可以实现分页抓取)
    start_requests
    该方必须返回一个可迭代的对象,对象中包含了spider用于爬取的第一个request.(加for循环,实现翻页抓取)

    注:然后去setting里将  ROBOTSTXT_OBEY = False  (不遵循网站的robots协议)

     4,在项目的根目录下新建run.py 运行脚本,注意是根目录

    from scrapy.cmdline import execute
    execute(['scrapy','crawl','lianxi'])

    我们的爬虫项目到此也就配置完毕,下面我来说一下setting里的配置说明

    DOWNLOAD_DELAY = 2-----------设置爬取间隔
    DEFAULT_REQUEST_HEADERS-----------设置头信息
    ROBOTSTXT_OBEY = True-----------如果启用,Scrapy将会采用 robots.txt策略
    AUTOTHROTTLE_START_DELAY = 5----------开始下载时限速并延迟时间
    AUTOTHROTTLE_MAX_DELAY = 60------------高并发请求时最大延迟时间
    CONCURRENT_REQUESTS = 16-----------开启线程数量,默认16

    setting中可以设置全局请求头信息,

    当然在我们的爬虫程序中也可以,不过需要注意cookies的格式,

    cookies = {'Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac': '1788*1*PC_VC',...... }  注意是键值对的形式

    cookies 字符串转换为字典,

    keys = [i.split('=',1)[0] for i in cookie.split('; ')]
    values = [i.split('=',1)[1] for i in cookie.split('; ')]
    res = dict(zip(keys,values))
    print(res)

    我们再来看看response的几个方法 

    url (string) – 这个响应的URL
    headers (dict) – 这个响应的标题。字典值可以是字符串(对于单值标题)或列表(对于多值标题)。
    status (integer) –  响应的HTTP状态。默认为200。
    body (str) – 响应身体。它必须是str,而不是unicode,除非你使用了一个编码感知的Response子类,比如 TextResponse。
    text 返回响应str

    5,解析工具

    1)然后我们再来看一下scrapy为我们封装的 css解析工具。

    response.css('.text::text').extract()

    这里为提取所有带有class=’text’ 这个属性的元素里面的text返回的是一个列表

    response.css('.text::text').extract_first()

    这是取第一条,返回的是str

    print(response.css("div span::attr(class)").extract())

    这是取元素属性

    举例:

    我来解析一下,在浏览器中我们获取到需要的标签,然后 遍历取到我们需要的标签内容以及它的href属性,注意写法。

    css 查询集

    2)xpath方法,这种解析方法我们会常用的,我们接着看

    url = response.url+response.xpath('/html/body/div/div[2]/div[1]/div[1]/div/a[1]/@href').extract_first()

    和原来用法基本一样,这里是获取一个url 然后跟网站的主url拼接了

    print(response.xpath("//a[@class='tag']/text()").extract())

    https://blog.csdn.net/gongbing798930123/article/details/78955597  这个网址上是xpath语法大全,我这里就不在多说。

    3)当然,scrapy还为我们封装了re模块

    >>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").re('.*?(d+).*')
    ['28']
    >>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").re('.*?(d+).*')[0]
    '28'

    不过,我更习惯用原生的re。

    extract()解析:

    1)extract()方法会把原数据的selector类型转变为列表类型
    2)extract()会得到多个值,extract()[1]取第2个值
    3)extract_first()得到第一个值,类型为字符串。extract_first(default='')如果没取到返回默认值

    6,给Scrapy添加代理

    给请求添加代理有2种方式,第一种重写start_request方法,第二种是添加download中间件。

    第一种:

     def start_requests(self):
            start_url = 'http://httpbin.org/get'
            yield scrapy.Request(start_url,self.parse01,meta={'proxy': 'http://113.128.24.29:22121'})

    只是在meta中加了一个proxy代理。然后可以测试了,我们通过抓取这个网站就可以返回我们的请求的信息,如:

    第二种:

    1.在middlewares.py中增加一个类,取名:ProxyMiddleware即代理中间件:

    class ProxyMiddleware():
        def process_request(self, request, spider):
            request.meta['proxy'] = 'http://114.230.126.173:41472'

    当然这里还可以设置请求头:

    class AgantMiddleware(object):
        def __init__(self):
            self.user_agent = ['Mozilla/5.0 (Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0',、、、、、、]
        def process_request(self,request,spider):
            request.headers['User-Agent'] = random.choice(self.user_agent)

    然后在 setting中开启中间件:

    DOWNLOADER_MIDDLEWARES = {
       # 'test01.middlewares.Test01DownloaderMiddleware': 543,
       'test01.middlewares.ProxyMiddleware': 543,
    }

    优先级随意,只要不重复即可,这是设置全局代理ip

    7,POST请求

    from scrapy import FormRequest ##Scrapy中用作登录使用的一个包
    formdata = {
        'username': 'wangshang',
        'password': 'a706486'
    }
    yield scrapy.FormRequest(
        url='http://172.16.10.119:8080/bwie/login.do',
        formdata=formdata,
        callback=self.after_login,
    )

     8,meta()传参用法,

    假如需要从上一个函数传入下一个参数,我们需要。

    上个函数中:

    yield scrapy.Request(url,self.detail,meta={'title':title,'summary':summary,'views'})

    下一个函数中:

    response.meta['title']   

    接收就可以、

    9,爬取信息储存

    在item.py里定义需要储存字段。

    class CsdnItem(scrapy.Item):
        # define the fields for your item here like:
        title = scrapy.Field()
        summary = scrapy.Field()
        views = scrapy.Field()
        commits = scrapy.Field()

    在爬虫程序中,

    from ..items import CsdnItem
    
    def detail(self,response):
         item = CsdnItem()
         item['title'] = response.meta['title']
         item['summary'] = re.sub(r's+','',response.meta['summary'])
         item['views'] = response.meta['views']
         
         return item

    在piplines里,

    class Test01Pipeline(object):
        def process_item(self, item, spider):
                
            title = item['title']
            summary = item['summary']
            views = item['views']
         return item  

    注:注释需打开

    ITEM_PIPELINES = {
       'csdn.pipelines.CsdnPipeline': 300,
    }
  • 相关阅读:
    【CF1416D】Graph and Queries(虚点)
    【CF1120D】Power Tree(建图,差分,最小生成树)
    AtCoder Regular Contest 121
    [2021.5] 我要交作业!
    [校内训练2021_03_03]C
    [校内训练2021_03_02]C
    [经验与教训2021_03_01-2021_03_05]
    [校内训练2021_02_24]B,代数数的和仍然是代数数
    [校内训练2021_02_25]C
    [经验与教训2021_02_19-2021_02_26]
  • 原文地址:https://www.cnblogs.com/zbllly/p/10294252.html
Copyright © 2020-2023  润新知